Я перемещаю функциональность из functions.php темы в «плагин функциональности». Почему-то в functions.php все работает отлично. Но когда я перемещаю его в плагин, я получаю ошибку 500 для всей области wp-admin.
Я смог точно определить проблему в блоке кода таксономии, исключая функциональные блоки по частям.
Вот полный код регистрации произвольного типа сообщения:
function create_post_type() {
register_post_type( 'Ads',
array(
'labels' => array(
'name' => 'Ads',
'singular_name' => 'Ad',
'menu_name' => 'Ads',
'name_admin_bar' => 'Ad',
'add_new' => 'Add New',
'add_new_item' => 'Add New Ad',
'new_item' => 'New Ad',
'edit_item' => 'Edit Ad',
'view_item' => 'View Ad',
'all_items' => 'All Ads',
'search_items' => 'Search Ads',
'parent_item_colon' => 'Parent Ads:',
'not_found' => 'No ads found.',
'not_found_in_trash' => 'No ads found in Trash.'
),
'public' => true,
'has_archive' => true,
'rewrite' => true,
'hierarchical' => true,
'supports' => array(
'title',
'revisions'
),
)
);
}
/* This piece bellow is causing trouble*/
register_taxonomy("Placements", array("ads"), array(
"hierarchical" => true,
"label" => "Placements",
"singular_label" => "Placement",
"rewrite" => true
));
/* End of trouble making code */
add_action( 'init', 'create_post_type' );
и вот журнал ошибок
[Tue May 01 23:11:04.268105 2018] [:error] [pid 24511] [client 174.214.1.78:15113] PHP Fatal error: Uncaught Error: Call to a member function add_rewrite_tag() on null in /nas/content/live/adsplugintest/wp-includes/rewrite.php:172\nStack trace:\n#0 /nas/content/live/adsplugintest/wp-includes/class-wp-taxonomy.php(379): add_rewrite_tag('%Placements%', '([^/]+)', 'placements=')\n#1 /nas/content/live/adsplugintest/wp-includes/taxonomy.php(386): WP_Taxonomy->add_rewrite_rules()\n#2 /nas/content/live/adsplugintest/wp-content/plugins/custom-ads-plugin/custom-ads.php(45): register_taxonomy('Placements', Array, Array)\n#3 /nas/content/live/adsplugintest/wp-settings.php(305): include_once('/nas/content/li...')\n#4 /nas/content/live/adsplugintest/wp-config.php(121): require_once('/nas/content/li...')\n#5 /nas/content/live/adsplugintest/wp-load.php(37): require_once('/nas/content/li...')\n#6 /nas/content/live/adsplugintest/wp-admin/admin.php(31): require_once('/nas/content/li...')\n#7 /nas/content/live/adsplugintest/wp-admin/index.php(10): require_once('/nas/content/li...')\n#8 {main}\n thrown in /nas/content/live/adsplugintest/wp-includes/rewrite.php on line 172
добавлен журнал ошибок
Вам необходимо вызвать метод register_taxonomy()
как часть действия init
(как вы это делали для register_post_type()
.
Обновленный код будет:
function create_post_type() {
register_post_type( ... );
register_taxonomy( ... );
}
add_action( 'init', 'create_post_type' );
В настоящий момент вы вызываете register_taxonomy()
напрямую, а не через действие init
, поэтому он запускается слишком рано, чтобы WordPress мог обработать его должным образом.
Кодекс WordPress для register_taxonomy()
также упоминает это:
Use the
init
action to call this function. Calling it outside of an action can lead to troubles. See #15568 for details.
работает отлично! Спасибо. Еще один вопрос, если вы не против. Вы знаете, почему он работал в functions.php, а не в плагине?
@kulbulbul Я мог бы покопаться в коде WordPress, чтобы найти точную причину, но это был бы просто порядок, в котором различные файлы / функции загружаются и выполняются. Плагины будут обрабатываться до того, как будут обработаны файлы темы, поэтому плагин запускается до того, как WordPress запустит функции, необходимые для регистрации дополнительных таксономий. Добавив функцию к действию init
, WordPress может поставить в очередь требуемые функции для запуска в нужное время, когда все будет готово.