WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

after_switch_theme хук-событие . WP 3.3

Срабатывает после того, как тема была переключена на новую - при активации темы.

Срабатывает при первой загрузке WP, после того как тема была переключена на новую и старая тема при этом существует. Если старой темы не существует, то хук сработает так:

// один параметр: $stylesheet, а не два: $old_name, $old_theme
do_action( 'after_switch_theme', $stylesheet ); 

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

Следует использовать для активации новой темы.

Отличается от события switch_theme тем что срабатывает позже, а точнее, не в текущем исполняемом PHP скрипте, а в следующем - при следующей загрузке страницы (при активации темы происходит два редиректа и затем возврат на исходную страницу)...

Как это работает

Полная логика переключения темы:

  1. Мы на странице: /wp-admin/themes.php.

  2. Жмем кнопку (ссылку) «Активировать» тему.

  3. Переходим по ссылке вида: /wp-admin/themes.php?action=activate&stylesheet=twentyfifteen.

  4. Срабатывает хук switch_theme.

  5. Нас автоматом перекидывает на ссылку вида: /wp-admin/themes.php?activated=true.

  6. Срабатывает хук after_switch_theme.

  7. Теперь, нас автоматом перекидывает на исходную страницу: /wp-admin/themes.php

В результате, в последнем исполнении PHP скрипта, мы не видим как срабатывают оба хука переключения... Чтобы увидеть что там происходит, можно использовать обрыв с помощью die()...

Использование

add_action( 'after_switch_theme', 'action_function_name_987564', 10, 2 );
function action_function_name_987564( $old_name, $old_theme ) {
	// Действие...
}
$old_name(строка)
Название старой темы.
$old_theme(WP_Theme)
Объект WP_Theme старой темы. См. wp_get_theme()

Примеры

#1 Добавим опции темы по умолчанию при её активации

add_action('after_switch_theme', 'mytheme_setup_options');

function mytheme_setup_options( $old_name ) {
	$opt = array('opt1'=>'val1', 'opt2'=>'val2');

	add_option('mytheme_options', $opt );
}

#2 Другой вариант добавить опции темы при активации

Это такой же вариант как и в первом примере, только с использованием хука after_setup_theme, который срабатывает постоянно, а не один раз. Но в этом примере он сработает один раз, за счет проверки @ $_GET['activated'].

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

add_action( 'after_setup_theme', 'activate_my_theme' );
function activate_my_theme() {
	if ( @ $_GET['activated'] === 'true' && current_user_can('manage_options') ){
		$opt = array('opt1'=>'val1', 'opt2'=>'val2');

		add_option('mytheme_options', $opt );
	}
}

#3 Удаление опций при деактивации темы и добавление при активации

// удаляем настройки темы при деактивации
add_action('switch_theme', 'deactivate_my_theme');
function deactivate_my_theme( $old_name ){
	// доступны функции старой темы, но не новой
	delete_option('mytheme_options');
}

// добавляем настройки темы при активации
add_action('after_switch_theme', 'activate_my_theme' );
function activate_my_theme( $new_name ){
	// доступны функции новой темы, но не старой

	$opt = array('opt1'=>'val1', 'opt2'=>'val2');

	add_option('mytheme_options', $opt );
}

Где вызывается хук

check_theme_switched()
after_switch_theme
wp-includes/theme.php 2753
do_action( 'after_switch_theme', $old_theme->get( 'Name' ), $old_theme );
wp-includes/theme.php 2756
do_action( 'after_switch_theme', $stylesheet, $old_theme );

Где используется хук (в ядре WP)

wp-includes/default-filters.php 291
add_action( 'after_switch_theme', '_wp_menus_changed' );
wp-includes/default-filters.php 292
add_action( 'after_switch_theme', '_wp_sidebars_changed' );
wp-includes/theme.php 2734
remove_action( 'after_switch_theme', '_wp_menus_changed' );
wp-includes/theme.php 2735
remove_action( 'after_switch_theme', '_wp_sidebars_changed' );
4 коммента
  • Александр

    По какой-то причине не срабатывает. Для теста написал простейший код:

    // В самом начале functions.php, после <?php
    $test123 = "Нет события";
    add_action('after_switch_theme', 'activatingtheme');
    function activatingtheme(){
    	global $test123;
    	$test123 = "Событие сработало";
    }
    
    //Где-нибудь на странице сайта
    global $test123;
    echo $test123; //Нет события;

    Перегружаю страницу, активирую другую тему, активирую тему с кодом - результат указан

    Ответить2 года назад #
    • Kama7199

      При переключении не видно первую загрузку.

      Там схема такая: ты переключаешь тему, ВП делает какие-то операции и редиректит тебя на страницу http://wptest.ru/wp/wp-admin/themes.php?activated=true, где срабатывает этот хук. Потом ВП редиректит тебя где ты и был: http://wptest.ru/wp/wp-admin/themes.php.

      Чтобы в этом убедиться попробуй например записать опцию в БД...

      П.С. дополнил описание смотри раздел «Как это работает».

      Ответить2 года назад #
  • А можно ли по принципу третьего примера вешать не опции темы, а добавлять и удалять возможности (права) указанной роли? Или всё-таки лучше проверять так:

    if ( 'themes.php' == $pagenow && isset( $_GET['activated'] ) ){ // Test if theme is activated

    Спасибо!

    Ответить3 мес назад #
Здравствуйте, !     Войти . Зарегистрироваться