WordPress как на ладони
Наставник Трепачёв Д.П., phphtml.net wordpress jino

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', 10, 2 );
function ____action_function_name( $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 WP 4.8.1
...

		if ( $old_theme->exists() ) {
			/**
			 * Fires on the first WP load after a theme switch if the old theme still exists.
			 *
			 * This action fires multiple times and the parameters differs
			 * according to the context, if the old theme exists or not.
			 * If the old theme is missing, the parameter will be the slug
			 * of the old theme.
			 *
			 * @since 3.3.0
			 *
			 * @param string   $old_name  Old theme name.
			 * @param WP_Theme $old_theme WP_Theme instance of the old theme.
			 */
			do_action( 'after_switch_theme', $old_theme->get( 'Name' ), $old_theme );
		} else {
			/** This action is documented in wp-includes/theme.php */
			do_action( 'after_switch_theme', $stylesheet );
		}
		flush_rewrite_rules();

		update_option( 'theme_switched', false );
	}
}

/**
 * Includes and instantiates the WP_Customize_Manager class.
 *
 * Loads the Customizer at plugins_loaded when accessing the customize.php admin
 * page or when any request includes a wp_customize=on param or a customize_changeset
...
Фрагмент из: wp-includes/theme.php WP 4.8.1
...
			 * Fires on the first WP load after a theme switch if the old theme still exists.
			 *
			 * This action fires multiple times and the parameters differs
			 * according to the context, if the old theme exists or not.
			 * If the old theme is missing, the parameter will be the slug
			 * of the old theme.
			 *
			 * @since 3.3.0
			 *
			 * @param string   $old_name  Old theme name.
			 * @param WP_Theme $old_theme WP_Theme instance of the old theme.
			 */
			do_action( 'after_switch_theme', $old_theme->get( 'Name' ), $old_theme );
		} else {
			/** This action is documented in wp-includes/theme.php */
			do_action( 'after_switch_theme', $stylesheet );
		}
		flush_rewrite_rules();

		update_option( 'theme_switched', false );
	}
}

/**
 * Includes and instantiates the WP_Customize_Manager class.
 *
 * Loads the Customizer at plugins_loaded when accessing the customize.php admin
 * page or when any request includes a wp_customize=on param or a customize_changeset
 * param (a UUID). This param is a signal for whether to bootstrap the Customizer when
 * WordPress is loading, especially in the Customizer preview
 * or when making Customizer Ajax requests for widgets or menus.
...
after_switch_theme 3 комментария
  • Александр

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

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

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

    • Kama4477

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

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

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

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

Здравствуйте, !

Ваш комментарий