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');
numediaweb
источник