#php #wordpress #woocommerce #wordpress-plugin-creation
#php #wordpress #woocommerce #wordpress-создание плагина
Вопрос:
Я пишу плагин для WordPress с использованием WooCommerce. Мне нужно получить список категорий продуктов WooCommerce (таксономия 'product_cat'
) на странице администратора плагина (обратите внимание на акцент на «странице администратора»). Однако последующие вызовы get_categories()
и get_terms()
фильтрация по таксономии приводят к ошибке (я упростил код. Класс подменю находится где-то в другом месте и, насколько я понимаю, это не мешает):
add_action( 'init', 'myplugin_admin_settings' );
function myplugin_admin_settings() {
$plugin = new Submenu( new MyPlugin_Admin_Page('myplugin_options') );
$plugin->init();
}
class MyPlugin_Admin_Page {
public function __construct($option_name) {
$args = array(
'taxonomy' => 'product_cat',
'hide_empty' => false
);
var_export(get_categories( $args )); // Prints 'error'
var_export(get_terms( $args )); // Prints 'error'
var_export(get_terms()); // Prints the whole list of terms including those belonging to 'product_cat' taxonomy
}
}
Напечатанная ошибка:
WP_Error::__set_state(array( 'errors' => array ( 'invalid_taxonomy' => array ( 0 => 'Invalid taxonomy.', ), ), 'error_data' => array ( ),))array ( '' => NULL,)
Что указывает на то, что таксономия не существует. И действительно, если я обращаюсь к taxonomy_exists('product_cat')
нему, говорит false
. Однако весь список напечатанных терминов включает термины, принадлежащие 'product_cat'
, что кажется невозможным, если таксономия не существует. Это меня убивает. В качестве примера:
43 =>
WP_Term::__set_state(array(
'term_id' => 56,
'name' => 'Accesorios',
'slug' => 'accesorios',
'term_group' => 0,
'term_taxonomy_id' => 56,
'taxonomy' => 'product_cat',
'description' => '',
'parent' => 0,
'count' => 1,
'filter' => 'raw',
)),
Эти вызовы выполняются в init
hook, поэтому они должны возвращать категории продуктов.
Любой может понять, что происходит? Есть ли другой способ получить категории продуктов на страницах администратора?
Спасибо.
РЕДАКТИРОВАТЬ: я пробовал также с помощью хуков plugins_loaded
и woocommerce_init
.
Ответ №1:
Ну, я не знаю, что на самом деле произошло, но теперь он работает с использованием init
hook. Я пробовал раньше, но это не помогло, не знаю почему. Теперь я только что выполнил 2 теста: используйте функцию current_filter()
, чтобы проверить, что сама функция была правильно подключена; и подключитесь к init
функции, содержащей вызов get_terms($args)
. Затем я заметил, что это работает, и я отменил изменения, и все заработало. Сбой Ghost.
Комментарии:
1. Я не понимаю, почему -1 к ответу. Это все еще может дать людям некоторый helo, вместо этого я мог бы просто удалить его или удалить весь вопрос, мне все равно, но я думаю, что это может дать людям подсказки для перепроверки частей кода. И почему комментарий кого-то другого, кто предложил использовать hook
woocommerce_init
, здесь больше нет.