Что такое "принудительное обновление плагина", как я могу избежать этого и использовать его для своих плагинов


После обсуждения в твиттере кажется, что wordpress.org есть возможность отправлять обновления безопасности для плагинов даже на сайты, которые не подписались на автоматическое обновление плагинов. Может ли кто-нибудь объяснить причину этого и как я могу блокировать такого рода обновления?

С другой стороны, ограничена ли эта функциональность "магией", чтобы wordpress.org, или я могу использовать тот же механизм для обновления плагинов и тем, которые распространяются с моего собственного сервера, в то время как оставаясь в соответствии с общим процессом обновления и правилами ядра wordpress (очевидно, в моем коде я могу обойти все, чтобы запустить обновление, вопрос в том, как мне лучше всего соответствовать ожиданиям пользователей, выраженным настройкой констант или использованием различных фильтров, связанных с обновлением).

Author: Mark Kaplun, 2015-03-13

1 answers

Чтобы ответить на первый вопрос...

Если вы посмотрите в классе WP_Automatic_Updater, найденном в wp-admin/includes/class-wp-upgrader.php, мы отметим метод is_disabled, который используется методом should_update, чтобы определить, разрешено ли автоматическое обновление.

Метод is_disabled вернет значение true при следующих условиях,

  • если DISALLOW_FILE_MODS константа определена и равна true
  • если WP_INSTALLING константа определена независимо от состояния значения
  • если AUTOMATIC_UPDATER_DISABLED константа определяется как true

Имейте в виду, однако, что последняя константа AUTOMATIC_UPDATER_DISABLED также связана с фильтром automatic_updater_disabled, поэтому, даже если она определена, значение может быть отфильтровано в другом месте, и в этом случае вам лучше всего воспользоваться объявлением следующего крючка:

add_filter( 'automatic_updater_disabled', '__return_true' );

Вот выдержка из метода класса WP_Automatic_Updater:

wp-admin/includes/class-wp-upgrader.php:1730

/**
 * Whether the entire automatic updater is disabled.
 *
 * @since 3.7.0
 */
public function is_disabled() {
    // Background updates are disabled if you don't want file changes.
    if ( defined( 'DISALLOW_FILE_MODS' ) && DISALLOW_FILE_MODS )
        return true;

    if ( defined( 'WP_INSTALLING' ) )
        return true;

    // More fine grained control can be done through the WP_AUTO_UPDATE_CORE constant and filters.
    $disabled = defined( 'AUTOMATIC_UPDATER_DISABLED' ) && AUTOMATIC_UPDATER_DISABLED;

    /**
     * Filter whether to entirely disable background updates.
     *
     * There are more fine-grained filters and controls for selective disabling.
     * This filter parallels the AUTOMATIC_UPDATER_DISABLED constant in name.
     *
     * This also disables update notification emails. That may change in the future.
     *
     * @since 3.7.0
     *
     * @param bool $disabled Whether the updater should be disabled.
     */
    return apply_filters( 'automatic_updater_disabled', $disabled );
}

Я бы также предложил следующую ссылку для чтения:

Настройка автоматического фона Обновления

Http://codex.wordpress.org/Configuring_Automatic_Background_Updates

...который подробно содержит список доступных констант и фильтров для точного контроля над тем, какие компоненты отключать от обновлений.

Для случая отключения только автоматического обновления плагинов у вас есть:

add_filter( 'auto_update_plugin', '__return_false' );

...и так далее.

Чтобы ответить на ваш второй вопрос...

(кто-нибудь поправьте меня, если я ошибаюсь)

Давайте добавим некоторый контекст для читателей, весь этот вопрос является результатом этого статуса в Твиттере, который сам по себе был ответом на принудительное автоматическое обновление плагина WP SEO Yoast см. Следующее, https://yoast.com/wordpress-seo-security-release /, для получения дополнительной информации.

В wp-includes/update.php есть функция с именем wp_maybe_auto_update, которая запускается на крючке с тем же именем do_action('wp_maybe_auto_update'), которая запускается из функции wp_version_check, содержащейся в том же файле, который сам по себе является запланированное мероприятие, которое проходит два раза в день.

Итак, что я подозреваю WordPress.org сделал, заключалось в том, что они внутренне увеличили версию WordPress, чтобы автоматическое обновление было принудительным для пользователей из-за очевидной серьезности недостатка безопасности, связанного с плагином Yoast WP SEO.

К цитирую самого Йоаста:

Из-за серьезности проблемы, WordPress.org команда выпустила принудительное автоматическое обновление (спасибо!)

Я не на 100% уверен, что это на самом деле, а затем автоматически обновил любые другие плагины, у которых были новые версии в WordPress.org хранилище или есть или нет WordPress.org может указывать, какие плагины могут автоматически обновляться с их конца, возможно, в коде есть что-то, что также допускает такой тип усмотрения.

Относительно того, можете ли вы сами использовать те же механизмы, ну, для плагинов, которые вы размещаете в WordPress.org хранилище, да, для тех, кто находится за пределами официальный репозиторий, я не совсем уверен, но вы можете создать экземпляр класса WP_Automatic_Updater и предоставить ему контекст для проверки, но я думаю, что в конечном итоге мы получим функцию с именем wp_update_plugins в wp-includes/update.php, которая проверяет официальный API репозитория WordPress.

Возможно, я ошибаюсь, поэтому, если у кого-то есть что-то еще добавить, пожалуйста, вступайте в разговор.

 8
Author: Adam, 2020-06-15 08:21:38