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

init хук-событие . WP 1.5.2

Событие срабатывает после того, как WordPress полностью загружен, но до того, как любые header заголовки были отправлены.

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

К моменту срабатывания init текущий пользователь авторизован (global $current_user уже определена) и установлены все основные глобальные переменные и функции WordPress. Также функции темы уже подключены и все установки установлены: размеры картинок миниатюр, поддержка меню и т.д.

Вместо init можно использовать wp_loaded - это практически одинаковые события. wp_loaded срабатывает сразу после init и после проверки ms_site_check() (проверяет текущий блог в мультисайтовой сборке). wp_loaded не сработает, если текущий блок не пройдет проверку на работоспособность (не активен, удален, заспамлен, в архиве).

События которые срабатывают до init:
muplugins_loaded
registered_taxonomy
registered_post_type
plugins_loaded
sanitize_comment_cookies    
setup_theme 
load_textdomain
after_setup_theme
auth_cookie_malformed   
auth_cookie_valid   
set_current_user    
init

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

add_action( 'init', 'action_function_name_11' );
function action_function_name_11() {
	// Действие...
}

Примеры

#1 Обработка $_GET запроса

Допустим нам нужно перенаправить ссылку на страницу регистрации, если в запросе указана переменная register:

add_action('init', 'redirect_to_register');
function redirect_to_register(){
	if( isset( $_GET['register'] ) ) {
		wp_redirect( site_url() . 'wp-register.php');
		exit;
	}
}

#2 Подключение к другим событиям из init

add_action('init','all_my_hooks');
function all_my_hooks(){
	// подключение более поздних событий
	add_action('admin_init', 'my_function_name');
	add_action('admin_menu', 'my_function_name');
}

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

В файле: /wp-settings.php
init
wp-settings.php 525
do_action( 'init' );

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

wp-includes/blocks/archives.php 147
add_action( 'init', 'register_block_core_archives' );
wp-includes/blocks/calendar.php 75
add_action( 'init', 'register_block_core_calendar' );
wp-includes/blocks/categories.php 102
add_action( 'init', 'register_block_core_categories' );
wp-includes/blocks/latest-posts.php 131
add_action( 'init', 'register_block_core_latest_posts' );
wp-includes/blocks/rss.php 137
add_action( 'init', 'register_block_core_rss' );
wp-includes/blocks/search.php 82
add_action( 'init', 'register_block_core_search' );
wp-includes/blocks/shortcode.php 32
add_action( 'init', 'register_block_core_shortcode' );
wp-includes/blocks/tag-cloud.php 71
add_action( 'init', 'register_block_core_tag_cloud' );
wp-includes/class-wp-customize-manager.php 371
remove_action( 'init', 'wp_cron' );
wp-includes/class.wp-scripts.php 132
add_action( 'init', array( $this, 'init' ), 0 );
wp-includes/default-filters.php 447
add_action( 'init', 'rest_api_init' );
wp-includes/default-filters.php 529
add_action( 'init', 'wp_widgets_init', 1 );
wp-includes/default-filters.php 511
add_action( 'init', 'create_initial_taxonomies', 0 ); // highest priority
wp-includes/default-filters.php 489
add_action( 'init', 'kses_init' );
wp-includes/default-filters.php 475
add_action( 'init', 'create_initial_post_types', 0 ); // highest priority
wp-includes/default-filters.php 332
add_action( 'init', 'wp_cron' );
wp-includes/default-filters.php 399
add_action( 'init', '_show_post_preview' );
wp-includes/default-filters.php 369
add_action( 'init', 'wp_schedule_delete_old_privacy_export_files' );
wp-includes/default-filters.php 349
add_action( 'init', 'smilies_init', 5 );
wp-includes/default-filters.php 303
add_action( 'init', 'check_theme_switched', 99 );
wp-includes/default-filters.php 131
add_action( 'init', 'wp_init_targeted_link_rel_filters' );
wp-includes/ms-default-filters.php 16
add_action( 'init', 'ms_subdomain_constants' );
wp-includes/ms-default-filters.php 25
add_action( 'init', 'maybe_add_existing_user_to_blog' );
wp-includes/update.php 824
add_action( 'init', 'wp_schedule_update_checks' );
4 коммента
  • Светлана

    Добрый день.

    Очень нужна помощь.
    Такой вот вопрос - событие init - можно на этом этапе получить id поста?

    Подробнее: у меня есть плагин магазина.
    Функция создания продукта - вызывается так -

     add_action( 'init', 'create_product'); 

    результатом которой - register_post_type( 'al_product', $reg_settings );

    все работает - получаются ссылки у станиц типа - /catalog/series/gt-1710rgb/...
    где /catalog/series/ - это константа, которую я просто задала..

    А надо, что б ссылка была /catalog/$id поста/ ...

    Но в функции не могу получить ади.

    Вызывала так

    global $post; 
    $post_id = get_the_ID();
    echo $post_id .' - 123';

    Теперь вот думаю, может просто на этапе init - он еще не сформирован?
    совсем запуталась ....

    Подскажите, пожалуйста...

    1
    Ответить3.7 года назад #
    • Kama7482

      Готовый код не подскажу. Но направлю.

      На момент init основной запрос еще не создан, поэтому global $post; еще нет...

      Я сейчас не понимаю как у вас вообще регистрируется ЧПУ для типа записи. Но что вы делаете - это неправильно.

      Объясню как надо: в параметре rewrite функции register_post_type() указываете slug и в нем плейсхолдер %post_id%

      'rewrite' => array( 'slug'=>'catalog/%post_id%' ),

      Далее через хук

      apply_filters( 'post_type_link', $post_link, $post, $leavename, $sample );

      Заменяете этот плейсхолдер на реальный ID записи. Примерно так:

      add_filter('post_type_link', 'catalog_permalink', 1, 2);
      function catalog_permalink( $permalink, $post ){
      	// выходим если это не наш тип записи
      	if( strpos($permalink, 'catalog/%post_id%') === false )
      		return $permalink;
      
      	return str_replace('%post_id%', $post->ID, $permalink );
      }
      Ответить2.5 года назад #
  • @ mi132 cайт: trapeznaya.ucoz.ru

    Интересная деталь. код...

    add_action( 'plugins_loaded', 'my_loaded' );
    function my_loaded() {
      global $my_code;
      $my_code = wp_generate_password(4,false); 
    }

    Сработал 1й раз при загрузке и второй раз при ajax запросе. С init тоже самое. Как так понять не могу. То есть в скрытом поле формы прописываю $my_code, а при посылке сравниваю, но там уже в $my_code другой код, если еще раз нажать третий и т.д. при этом в скрытом поле не меняется как и должно быть. Пробывал стыковать чтобы проверить будет ли видна стыковка при новых запросах. Нет, стыковки нет.

    function my_ajax() {
       global $my_code;
       echo '/'.$_POST['code'].'/'.$my_code; 
    

    Подскажите почему так. cool

    /btNH/UUql

    Ответить29 дней назад #
    • @ campusboy3344 cайт: www.youtube.com/c/wpplus

      Потому что при ajax запросе - это отдельная инициализация движка, то есть снова запускается wp_generate_password(), которая естественно генерирует уже новый код.

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