Làm cách nào để loại trừ các plugin khỏi tự động cập nhật?


16

Có một bộ lọc chọn tham gia cho phép tất cả các plugin trên trang web của tôi nhận được cập nhật tự động:

add_filter( 'auto_update_plugin', '__return_true' );

Tôi thích tính năng này, nhưng tôi không muốn tất cả các plugin của mình được cập nhật tự động. Làm cách nào tôi có thể cho phép một số plugin được cập nhật tự động, trong khi loại trừ những plugin tôi muốn làm thủ công?

Câu trả lời:


20

Thay vì sử dụng mã từ câu hỏi trong Hàm.php, hãy thay thế bằng mã này:

/**
 * Prevent certain plugins from receiving automatic updates, and auto-update the rest.
 *
 * To auto-update certain plugins and exclude the rest, simply remove the "!" operator
 * from the function.
 *
 * Also, by using the 'auto_update_theme' or 'auto_update_core' filter instead, certain
 * themes or Wordpress versions can be included or excluded from updates.
 *
 * auto_update_$type filter: applied on line 1772 of /wp-admin/includes/class-wp-upgrader.php
 *
 * @since 3.8.2
 *
 * @param bool   $update Whether to update (not used for plugins)
 * @param object $item   The plugin's info
 */
function exclude_plugins_from_auto_update( $update, $item ) {
    return ( ! in_array( $item->slug, array(
        'akismet',
        'buddypress',
    ) ) );
}
add_filter( 'auto_update_plugin', 'exclude_plugins_from_auto_update', 10, 2 );

Mã này cũng có thể dễ dàng được điều chỉnh để tùy chỉnh các bản cập nhật chủ đề và cốt lõi.

Thống kê cập nhật plugin và chủ đề đã được thêm vào trong Wordpress 3.8.2 ( 27905 ). Hàm trên sử dụng slug để xác định các plugin, nhưng bạn có thể sử dụng bất kỳ thông tin nào của đối tượng (tính bằng $ item):

[id] => 15
[slug] => akismet
[plugin] => akismet/akismet.php
[new_version] => 3.0.0
[url] => https://wordpress.org/plugins/akismet/
[package] => https://downloads.wordpress.org/plugin/akismet.3.0.0.zip

Đối với Wordpress 3.8.1 trở xuống, hãy sử dụng chức năng này thay thế:

function exclude_plugins_from_auto_update( $update, $item ) {
    return ( ! in_array( $item, array(
        'akismet/akismet.php',
        'buddypress/bp-loader.php',
    ) ) );
}
add_filter( 'auto_update_plugin', 'exclude_plugins_from_auto_update', 10, 2 );

Đạo cụ truy cập @ WiseOwl9000 để chỉ ra sự thay đổi với WP 3.8.2


@kaiser Ý tưởng hay với việc cô đọng mã. Đã được một lúc kể từ khi tôi nhìn vào nó, nhưng thoạt nhìn có vẻ như điều này đảo ngược logic. Bạn đã kiểm tra điều này? Dường như các mục trong mảng hiện là những mục duy nhất được cập nhật tự động và mọi thứ khác sẽ bị loại trừ.
David

David, bạn đã hoàn toàn đúng: Đã sửa và +1
kaiser

3

Lưu ý kể từ wordpress 3.8.2, loại mục plugin được truyền cho hàm này đã thay đổi và bây giờ nó là một đối tượng.

/**
 * @package Plugin_Filter
 * @version 2.0
 */
/*
Plugin Name: Plugin Filter
Plugin URI: http://www.brideonline.com.au/
Description: Removes certain plugins from being updated. 
Author: Ben Wise
Version: 2.0
Author URI: https://github.com/WiseOwl9000
*/

/**
 * @param $update bool Ignore this it just is set to whether the plugin should be updated
 * @param $plugin object Indicates which plugin will be upgraded. Contains the directory name of the plugin followed by / followed by the filename containing the "Plugin Name:" parameters.  
 */
function filter_plugins_example($update, $plugin)
{
    $pluginsNotToUpdate[] = "phpbb-single-sign-on/connect-phpbb.php";
    // add more plugins to exclude by repeating the line above with new plugin folder / plugin file

    if (is_object($plugin))
    {
        $pluginName = $plugin->plugin;
    }
    else // compatible with earlier versions of wordpress
    {
        $pluginName = $plugin;
    }

    // Allow all plugins except the ones listed above to be updated
    if (!in_array(trim($pluginName),$pluginsNotToUpdate))
    {
        // error_log("plugin {$pluginName} is not in list allowing");
        return true; // return true to allow update to go ahead
    }

    // error_log("plugin {$pluginName} is in list trying to abort");
    return false;
}

// Now set that function up to execute when the admin_notices action is called
// Important priority should be higher to ensure our plugin gets the final say on whether the plugin can be updated or not.
// Priority 1 didn't work
add_filter( 'auto_update_plugin', 'filter_plugins_example' ,20  /* priority  */,2 /* argument count passed to filter function  */);

Đối tượng $ plugin có các mục sau:

stdClass Object
(
    [id] => 10696
    [slug] => phpbb-single-sign-on
    [plugin] => phpbb-single-sign-on/connect-phpbb.php
    [new_version] => 0.9
    [url] => https://wordpress.org/plugins/phpbb-single-sign-on/
    [package] => https://downloads.wordpress.org/plugin/phpbb-single-sign-on.zip
)

Tôi thích câu trả lời của bạn, nhưng sẽ thật tuyệt nếu bạn có thể thêm tài liệu để hỗ trợ cho việc đọc thêm. Cảm ơn
Pieter Goosen

Tài liệu tham khảo duy nhất tôi có thể tìm thấy trong bộ mã để kiểm soát cập nhật plugin là ở đây: codex.wordpress.org/iêu Tôi không thể tìm thấy bất cứ điều gì trong bất kỳ nhật ký thay đổi nào để hỗ trợ thay đổi đối tượng thay vì chuỗi được thông qua.
WiseOwl9000

Tôi đã chỉnh sửa / cập nhật câu trả lời của mình để giải thích cho sự thay đổi. Đây là bộ thay đổi mà bạn đang tìm kiếm: core.trac.wordpress.org/changeset/27905
David
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.