after_setup_theme всегда запускается


11

Я настраиваю дочернюю тему для некоторых из моих преподавателей, и как часть этой темы я хотел бы, чтобы несколько плагинов были активированы во время активации темы. Поэтому, естественно, я использовал действие after_setup_theme и вызвал мою функцию установки. Он отлично работает, за исключением того, что работает по КАЖДОМУ запросу (администратору и т. Д.). Я доказал это, добавив это в конец функции настройки:

echo '<script type="text/javascript">alert("This action was run")</script>';

И в результате получите предупреждение javascript на каждый запрос администратора и каждый внешний запрос (у меня есть настройка сети, поэтому, очевидно, на сайтах, где эта тема не активна, она не выполняет функцию)

Итак, вопрос в том, является ли это ошибкой? Я что-то делаю не так? Вот полный код, который я использую:

add_action( 'after_setup_theme', 'fwp_setup' );
function fwp_setup(){
    // -- Unrelated code remove for the sake of brevity 
    require_once($_SERVER['DOCUMENT_ROOT'].'/wp-admin/includes/plugin.php');
    activate_plugin('enable-media-replace/enable-media-replace.php');
    activate_plugin('seo-image/seo-friendly-images.php');
    activate_plugin('w3-total-cache/w3-total-cache.php');
    echo '<script type="text/javascript">alert("This action was run")</script>';
}

Любое понимание будет высоко ценится!


РЕШЕНИЕ: after_switch_themeделает именно то, что я намеревался здесь. Он срабатывает после переключения темы на вашу тему. Одно из упомянутых ниже решений использует switch_theme. Это не дает желаемых результатов, поскольку это происходит только при переключении с вашей темы. Ссылка на комментарий Trac
Аарон Вагнер

пожалуйста, опубликуйте это как ответ , а не как комментарий к вашему вопросу. :)
Чип Беннетт

2
Извиняюсь. Это не позволило бы мне сделать это еще. Я добавлю это как ответ через немного.
Аарон Вагнер

Ответы:


8

РЕШЕНИЕ: after_switch_themeделает именно то, что я намеревался здесь. Он срабатывает после переключения темы на вашу тему. Одно из упомянутых ниже решений использует switch_theme. Это не дает желаемых результатов, поскольку это происходит только при переключении с вашей темы.

Вот статья, которую я нашел в качестве ссылки: http://core.trac.wordpress.org/ticket/7795#comment:29

Вот мой модифицированный код

add_action( 'after_switch_theme', 'fwp_theme_setup' );
function fwp_theme_setup(){ 
    require_once($_SERVER['DOCUMENT_ROOT'].'/wp-admin/includes/plugin.php');
    activate_plugin('enable-media-replace/enable-media-replace.php');
    activate_plugin('seo-image/seo-friendly-images.php');
    activate_plugin('w3-total-cache/w3-total-cache.php');
}

5

after_setup_themeДействие предназначено для огня на каждом WordPress нагрузки. Это просто часть процесса, во время которого WordPress вызывает систему шаблонов, определяет различные параметры настройки для темы, а затем переходит к последующей обработке, такой как определение правильного шаблона для отображения и т. Д.

Другими словами, after_setup_themeпредставляет собой точку, в которой WordPress устанавливает текущую тему, а не точку, в которой администратор активирует и / или настраивает текущую тему.

То, что вы ищете, это хук активации темы , который в настоящее время недоступен, но находится на стадии рассмотрения / разработки .


Ссылка на Кодекс вводит в заблуждение тогда. Он говорит: «Этот хук вызывается во время инициализации темы». Для меня это означает, что хук должен вызываться, когда он активирован. Я понимаю, что вы говорите, хотя. Ужасно вводит в заблуждение.
Аарон Вагнер

5
init !== activation, Обычно вы называете __construct()функцию в php также initфункцией. Это значит: инициализировать экземпляр.
Кайзер

Билет на 7 лет, и, похоже, он не будет исправлен!
numediaweb

4

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

Просто используйте «крюк активации темы» для активации плагинов.

Лучшее решение в том же духе это . Оба по существу используют switch_themeкрюк.


В соответствии с комментариями OP и связанным билетом trac - after_switch_themeтребуется крюк.

Это передает имя старой темы в качестве аргумента. Однако, если это находится в вашем functions.php(что должно быть ...), обратный вызов будет срабатывать только при активации вашей темы .

add_action( 'after_switch_theme', 'wpse50298_setup' );
function wpse50298_setup($theme_switching_from){
    // Your theme is being activated
}

Аналогично добавление обратного вызова switch_themeбудет вызываться только тогда, когда ваша тема деактивирована.

add_action( 'switch_theme', 'wpse50298_deactivate' );
function wpse50298_deactivate($theme_switching_to){
    // Your theme is being deactivated
}

Ни один из этих вариантов не работал для меня. switch_themeработал только после деактивации темы. Тем не менее, after_switch_themeработал отлично.
Аарон Вагнер

1
обновленный ответ :)
Стивен Харрис

switch_theme, похоже, больше не работает. Я думаю, что это из-за изменений в активации 3.4. По крайней мере, это не работает для меня.
Джейк

after_switch_theme работает отлично. Это должен быть принятый ответ. Я использую WP 3.5
Ardee Aram

0

Лучшим решением может быть использование сценария активации плагина Томаса Гриффина . Это предложит пользователям установить плагины по вашему выбору, когда тема используется. Я думаю, что это отличный способ отделить плагин от темы и по-прежнему использовать его.

В вашей теме проверьте, активен ли плагин, прежде чем использовать его функции. Это позволит пользователям больше выбора и контроля.

Вы можете легко настроить скрипт активации с помощью рюкзака .



0

Лучше всего было бы теперь использовать switch_themeловушку и отфильтровать переданный аргумент '$ theme', чтобы увидеть, является ли он текущим, а затем, если не возвращен;

function nw_update_network($theme) {
   if ($theme !== 'my_theme_name') return;

   // Your code here
}

add_action('switch_theme', 'nw_update_network');
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.