Bagaimana cara mengecualikan plugin agar tidak diperbarui secara otomatis?

16

Ada filter keikutsertaan yang memungkinkan semua plugin di situs saya menerima pembaruan otomatis:

add_filter( 'auto_update_plugin', '__return_true' );

Saya suka fitur ini, tetapi saya tidak ingin semua plugin saya diperbarui secara otomatis. Bagaimana saya dapat mengizinkan beberapa plugin diperbarui secara otomatis, sementara mengecualikan yang ingin saya lakukan secara manual?

David
sumber

Jawaban:

20

Alih-alih menggunakan kode dari pertanyaan di functions.php, ganti dengan ini:

/**
 * 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 );

Kode ini dapat dengan mudah diubah untuk menyesuaikan pembaruan tema dan inti juga.

Plugin dan statistik pembaruan tema ditambahkan di Wordpress 3.8.2 ( 27905 ). Fungsi di atas menggunakan siput untuk mengidentifikasi plugin, tetapi Anda dapat menggunakan info objek apa pun (dalam $ 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

Untuk Wordpress 3.8.1 dan di bawahnya, gunakan fungsi ini sebagai gantinya:

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 );

Props pergi ke @ WiseOwl9000 untuk menunjukkan perubahan dengan WP 3.8.2

David
sumber
@kaiser Ide bagus dengan mengkondensasi kode. Sudah beberapa saat sejak saya melihat ini, tetapi pada pandangan pertama sepertinya ini membalikkan logika. Apakah Anda menguji ini? Tampaknya item dalam array sekarang adalah satu-satunya yang akan diperbarui secara otomatis, dan semua yang lain akan dikecualikan.
David
David, Anda sepenuhnya benar: Memperbaiki dan memberi +1
kaiser
3

Catatan pada wordpress 3.8.2 jenis item plugin yang diteruskan ke fungsi ini telah berubah dan sekarang menjadi objek.

/**
 * @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  */);

Objek $ plugin memiliki yang berikut:

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
)
WiseOwl9000
sumber
Saya suka jawaban Anda, tetapi akan lebih baik jika Anda dapat menambahkan dokumentasi untuk mendukungnya untuk dibaca lebih lanjut. Terima kasih
Pieter Goosen
Satu-satunya referensi yang dapat saya temukan dalam codex untuk mengendalikan pembaruan plugin adalah di sini: codex.wordpress.org/... Saya tidak dapat menemukan apa pun di log perubahan apa pun untuk mendukung perubahan pada objek, alih-alih string yang diteruskan.
WiseOwl9000
Saya mengedit / memperbarui jawaban saya ke akun untuk perubahan. Inilah perubahan yang Anda cari: core.trac.wordpress.org/changeset/27905
David