Я создаю сайт Wordpress, в котором я хотел использовать пользовательскую таксономию в своих опциях темы, которые я зарегистрировал использование рычага 'init'. Но проблема состояла в том, что рычаги 'init' запущены после опций темы (я использую плагин Платформы Возвращения для опций темы). Таким образом, когда я использовал get_categories () функция в моих опциях темы и пытался получить пользовательскую таксономию, я получал 'invalid_category' ошибку.
Таким образом, я решил просто зарегистрировать таксономию без любых рычагов и просто вызова register_taxonomy () функция в functions.php файле, и это работало.
Я просто хочу знать, 'безопасно' ли это, как в, что было бы последствиями, если я просто вызываю функцию register_taxonomy, не используя рычагов.
Вот код, который не работает при использовании рычага init:
function my_function(){
register_taxonomy( 'portfolio_category', 'portfolio', array(
'labels' => array(
'name' => _x( 'Portfolio Categories', 'taxonomy general name' ),
'singular_name' => _x( 'Portfolio Category', 'taxonomy singular name' ),
'search_items' => __( 'Search Portfolio Categories' ),
'all_items' => __( 'All Portfolio Categories' ),
'parent_item' => __( 'Parent Portfolio Category' ),
'parent_item_colon' => __( 'Parent Portfolio Category:' ),
'edit_item' => __( 'Edit Portfolio Category' ),
'update_item' => __( 'Update Portfolio Category' ),
'add_new_item' => __( 'Add New Portfolio Category' ),
'new_item_name' => __( 'New Portfolio Category' ),
'menu_name' => __( 'Portfolio Categories' ),
),
'hierarchical' => true,
) );
}
add_action('init', 'my_function');
$portfolio_categories = get_categories(array('taxonomy' => 'portfolio_category', 'hide_empty'=> 0));
echo "<pre>", print_r($portfolio_categories), "</pre>"; // This will return an error of 'invalid_taxonomy'
И вот тот, который работает, (не используя рычагов):
register_taxonomy( 'portfolio_category', 'portfolio', array(
'labels' => array(
'name' => _x( 'Portfolio Categories', 'taxonomy general name' ),
'singular_name' => _x( 'Portfolio Category', 'taxonomy singular name' ),
'search_items' => __( 'Search Portfolio Categories' ),
'all_items' => __( 'All Portfolio Categories' ),
'parent_item' => __( 'Parent Portfolio Category' ),
'parent_item_colon' => __( 'Parent Portfolio Category:' ),
'edit_item' => __( 'Edit Portfolio Category' ),
'update_item' => __( 'Update Portfolio Category' ),
'add_new_item' => __( 'Add New Portfolio Category' ),
'new_item_name' => __( 'New Portfolio Category' ),
'menu_name' => __( 'Portfolio Categories' ),
),
'hierarchical' => true,
) );
$portfolio_categories = get_categories(array('taxonomy' => 'portfolio_category', 'hide_empty'=> 0));
echo "<pre>", print_r($portfolio_categories), "</pre>";
Также первые работы кода, если я поместил его в шаблон страницы, таким образом, я знаю, что делаю его правильно. Сообщите мне об этом
Спасибо.
Ваш код, не используя рычаг init использует также рычаг, но не запущенный из Вашего источника. Последнее это было запущено из включения Вашей темы, которая была загружена в WordPress. Это очень плохо для Вашего управления. Если Вы используете рычаг, то включение из Вашего источника на Вашем управлении, Вы выбираете рычаг. Если Вы уедете, это открытое и ядро WP изменяет порядок или другие точки включения темы, возможно, у Вас есть проблема, как функция никогда не будет работать. Также это - плохой стиль, что Вы не ловите свой источник в обертке, как функция для управления. Также легче читать, fied на этом рычаге, этом обратном вызове - Ваша функция.
Согласно кодексу WordPress на register_taxonomy()
Используйте init действие для вызывания этой функции. Вызов его за пределами действия может привести к проблемам. Посмотрите № 15568 для деталей.
Лучше будьте в безопасности, чем жаль при регистрации пользовательского taxonomies для пользовательских типов сообщения. Использовать
register_taxonomy_for_object_type()
прямо после функции для соединения их. Еще Вы могли столкнуться с minetraps, где тип сообщения не присоединяется в обратном вызове фильтра, которые работают во времяparse_request
илиpre_get_posts
.
Таким образом, я доверил бы кодексу и придерживался бы использования init
сцепитесь затем пытаются выяснить почему get_categories()
не работает правильно.
По сути небезопасно сделать что-либо за пределами рычага, когда-либо.
В Вашем случае настоящей проблемой не является то, что Вы используете init рычаг действия, случается так, что Ваш вызов к get_categories не в функции на рычаге действия.
Я полагаю, что необходимо понять "рычаги" в более общих чертах.
Цель системы "рычага" в WordPress состоит в том, чтобы иметь код, выполняются в корректном месте, в корректное время. Простой, действительно. Определенные вещи должны произойти в определенном порядке.
Теперь, один способ гарантировать определенный порядок состоит в том, чтобы просто записать набор кода в файле в порядке, Вы хотите, чтобы он выполнил и затем выполнил его. Простой подход. Однако это имеет проблему добавления в произвольном коде в отдельных моментах в том файле позже. Это - то, где рычаги решают проблему.
WordPress выполняет много кода в определенном порядке. Рычаги используются для введения другого кода в тот предопределенный определенный порядок в именованных местах. Так, код, который не является внутренними функциями, подключенными к рычагам просто, работает в порядке от вершины файла к нижней части файла, везде, где тот файл, оказывается, включен. И тот файл мог бы быть включен по-разному. Вы не можете знать наверняка. Используя рычаг позволяет Вам поместить свой код в основном где угодно, но зайти в него точно правильное время, время Вашего собственного выбора.
Таким образом для кода в плагинах или кода в functions.php файле темы, затем реалистично у Вас никогда не должно быть кода, который не находится в функции и сцеплен, никогда. Существует пара особых случаев тут и там, но чинила немногих из них.
ВЕСЬ код в functions.php файле темы должен быть в функциях, которые присоединены к некоторому рычагу где-нибудь. Это называют "functions.php" по причине, это только должно содержать функции, не кодировать за пределами функций.