При регистрации таксономии для настраиваемого типа сообщения в «подключаемом модуле» возникает ошибка 500

Я перемещаю функциональность из 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

HTTP 500 - это типичное сообщение об ошибке на стороне сервера. Каждый раз, когда вы это видите, первым делом следует проверить журналы ошибок для получения более подробной информации. Без этого мы не сможем вам помочь.
Chris 02.05.2018 02:50

добавлен журнал ошибок

kulbulbul 02.05.2018 03:28
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
407
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам необходимо вызвать метод 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 02.05.2018 04:05

@kulbulbul Я мог бы покопаться в коде WordPress, чтобы найти точную причину, но это был бы просто порядок, в котором различные файлы / функции загружаются и выполняются. Плагины будут обрабатываться до того, как будут обработаны файлы темы, поэтому плагин запускается до того, как WordPress запустит функции, необходимые для регистрации дополнительных таксономий. Добавив функцию к действию init, WordPress может поставить в очередь требуемые функции для запуска в нужное время, когда все будет готово.

Kirk Beard 02.05.2018 04:15

Другие вопросы по теме