Wie schließe ich Plugins von der automatischen Aktualisierung aus?

16

Es gibt einen Opt-In-Filter, mit dem alle Plugins auf meiner Site automatische Updates erhalten können:

add_filter( 'auto_update_plugin', '__return_true' );

Ich mag diese Funktion, möchte aber nicht, dass alle meine Plugins automatisch aktualisiert werden. Wie kann ich zulassen, dass einige Plugins automatisch aktualisiert werden, ohne dass ich die Plugins manuell aktualisieren möchte?

David
quelle

Antworten:

19

Anstatt den Code aus der Frage in functions.php zu verwenden, ersetzen Sie ihn durch diesen:

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

Dieser Code kann einfach angepasst werden, um auch Themen- und Kernupdates anzupassen.

Statistiken zu Plugins und Themes wurden in Wordpress 3.8.2 ( 27905 ) hinzugefügt . Die obige Funktion verwendet den Slug, um die Plugins zu identifizieren, aber Sie können jede der Informationen des Objekts verwenden (in $ 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

Verwenden Sie für Wordpress 3.8.1 und niedriger stattdessen diese Funktion:

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

Die Requisiten gehen zu @ WiseOwl9000, um auf die Änderung mit WP 3.8.2 hinzuweisen

David
quelle
@kaiser Schöne Idee mit der Verdichtung des Codes. Es ist schon eine Weile her, dass ich mir das angeschaut habe, aber auf den ersten Blick sieht es so aus, als würde dies die Logik umkehren. Hast du das getestet? Es scheint, dass die Elemente im Array jetzt die einzigen sind, die automatisch aktualisiert werden und alles andere ausgeschlossen wird.
David
David, Sie waren völlig recht: Feste und + 1ed
kaiser
3

Beachten Sie, dass sich ab WordPress 3.8.2 der Typ des an diese Funktion übergebenen Plugin-Elements geändert hat und es sich nun um ein Objekt handelt.

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

Das $ plugin-Objekt hat Folgendes:

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
quelle
Ich mag Ihre Antwort, aber es wäre großartig, wenn Sie Dokumentation hinzufügen könnten, um dies für die weitere Lektüre zu unterstützen. Vielen Dank
Pieter Goosen
Der einzige Verweis, den ich im Codex finden konnte, um Plugin-Updates zu kontrollieren, ist hier: codex.wordpress.org/… Ich konnte in keinem Änderungsprotokoll etwas finden, um die Änderung an einem Objekt zu unterstützen, anstatt eine Zeichenfolge zu übergeben.
WiseOwl9000
Ich habe meine Antwort bearbeitet / aktualisiert, um die Änderung zu berücksichtigen. Hier ist das Änderungsset, nach dem Sie gesucht haben: core.trac.wordpress.org/changeset/27905
David