Что такое "принудительное обновление плагина", как я могу избежать этого и использовать его для своих плагинов
После обсуждения в твиттере кажется, что wordpress.org есть возможность отправлять обновления безопасности для плагинов даже на сайты, которые не подписались на автоматическое обновление плагинов. Может ли кто-нибудь объяснить причину этого и как я могу блокировать такого рода обновления?
С другой стороны, ограничена ли эта функциональность "магией", чтобы wordpress.org, или я могу использовать тот же механизм для обновления плагинов и тем, которые распространяются с моего собственного сервера, в то время как оставаясь в соответствии с общим процессом обновления и правилами ядра wordpress (очевидно, в моем коде я могу обойти все, чтобы запустить обновление, вопрос в том, как мне лучше всего соответствовать ожиданиям пользователей, выраженным настройкой констант или использованием различных фильтров, связанных с обновлением).
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.
Возможно, я ошибаюсь, поэтому, если у кого-то есть что-то еще добавить, пожалуйста, вступайте в разговор.