¿Cómo excluyo los complementos de la actualización automática?

16

Hay un filtro opcional que permite que todos los complementos de mi sitio reciban actualizaciones automáticas:

add_filter( 'auto_update_plugin', '__return_true' );

Me gusta esta función, pero no quiero que todos mis complementos se actualicen automáticamente. ¿Cómo puedo permitir que algunos complementos se actualicen automáticamente, al tiempo que excluyo los que quiero hacer manualmente?

David
fuente

Respuestas:

20

En lugar de usar el código de la pregunta en functions.php, reemplácelo con esto:

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

Este código también puede modificarse fácilmente para personalizar el tema y las actualizaciones principales.

Las estadísticas de actualización de plugins y temas se agregaron en Wordpress 3.8.2 ( 27905 ). La función anterior usa la babosa para identificar los complementos, pero puede usar cualquier información del objeto (en $ 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

Para Wordpress 3.8.1 y posteriores, use esta función en su lugar:

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

Los accesorios van a @ WiseOwl9000 para señalar el cambio con WP 3.8.2

David
fuente
@kaiser Buena idea con condensar el código. Ha pasado un tiempo desde que vi esto, pero a primera vista parece que esto revierte la lógica. ¿Probaste esto? Parece que los elementos en la matriz ahora son los únicos que se actualizarían automáticamente, y todo lo demás quedaría excluido.
David
David, tenías toda la razón: arreglado y + 1ed
kaiser
3

Tenga en cuenta que a partir de wordpress 3.8.2, el tipo de elemento del complemento pasado a esta función ha cambiado y ahora es un objeto.

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

El objeto $ plugin tiene lo siguiente:

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
fuente
Me gusta su respuesta, pero sería genial si pudiera agregar documentación que lo respalde para leer más. Gracias
Pieter Goosen
La única referencia que pude encontrar en el códice para controlar las actualizaciones de complementos está aquí: codex.wordpress.org/… No pude encontrar nada en ningún registro de cambios para respaldar el cambio a un objeto en lugar de pasar una cadena.
WiseOwl9000
Edité / actualicé mi respuesta para dar cuenta del cambio. Aquí está el conjunto de cambios que estaba buscando: core.trac.wordpress.org/changeset/27905
David