Как добавить пользовательскую таксономию в плагин WooCommerce

25 нояб. 2013 г., 22:34:11
Просмотры: 38.9K
Голосов: 12

Я пытаюсь добавить пользовательскую таксономию в WooCommerce, нацеливаясь на тип записи product. Я использовал следующий код и добавил его в functions.php. Я не получаю сообщений об ошибках, но таксономия не отображается в WooCommerce. Можете, пожалуйста, подсказать, как это сделать правильно или что я делаю не так?

<?php
// Регистрация пользовательской таксономии
function custom_taxonomy_Item()  {

$labels = array(
    'name'                       => 'Элементы',
    'singular_name'              => 'Элемент',
    'menu_name'                  => 'Элемент',
    'all_items'                  => 'Все элементы',
    'parent_item'                => 'Родительский элемент',
    'parent_item_colon'          => 'Родительский элемент:',
    'new_item_name'              => 'Название нового элемента',
    'add_new_item'               => 'Добавить новый элемент',
    'edit_item'                  => 'Редактировать элемент',
    'update_item'                => 'Обновить элемент',
    'separate_items_with_commas' => 'Разделяйте элементы запятыми',
    'search_items'               => 'Поиск элементов',
    'add_or_remove_items'        => 'Добавить или удалить элементы',
    'choose_from_most_used'      => 'Выбрать из наиболее используемых элементов',
);
$args = array(
    'labels'                     => $labels,
    'hierarchical'               => true,
    'public'                     => true,
    'show_ui'                    => true,
    'show_admin_column'          => true,
    'show_in_nav_menus'          => true,
    'show_tagcloud'              => true,
);
register_taxonomy( 'item', 'product', $args );
}
?>

Обновление

<?php
add_action( 'init', 'custom_taxonomy_Item' );

// Регистрация пользовательской таксономии
function custom_taxonomy_Item()  {

$labels = array(
    'name'                       => 'Элементы',
    'singular_name'              => 'Элемент',
    'menu_name'                  => 'Элемент',
    'all_items'                  => 'Все элементы',
    'parent_item'                => 'Родительский элемент',
    'parent_item_colon'          => 'Родительский элемент:',
    'new_item_name'              => 'Название нового элемента',
    'add_new_item'               => 'Добавить новый элемент',
    'edit_item'                  => 'Редактировать элемент',
    'update_item'                => 'Обновить элемент',
    'separate_items_with_commas' => 'Разделяйте элементы запятыми',
    'search_items'               => 'Поиск элементов',
    'add_or_remove_items'        => 'Добавить или удалить элементы',
    'choose_from_most_used'      => 'Выбрать из наиболее используемых элементов',
);
$args = array(
    'labels'                     => $labels,
    'hierarchical'               => true,
    'public'                     => true,
    'show_ui'                    => true,
    'show_admin_column'          => true,
    'show_in_nav_menus'          => true,
    'show_tagcloud'              => true,
);
register_taxonomy_for_object_type( 'item', 'product', $args );

}
?>
2
Комментарии

К какому действию (action) вы прикрепили вашу функцию custom_taxonomy_Item?

Milo Milo
25 нояб. 2013 г. 22:39:54

Честно говоря, я не знал, к какому действию прикрепить. Я не смог найти, какая часть плагина отвечает за это?

user1760110 user1760110
25 нояб. 2013 г. 22:46:26
Все ответы на вопрос 1
9
19

Вам необходимо сделать:

add_action( 'init', 'custom_taxonomy_Item' );

Потому что:

Используйте действие init для вызова этой функции. Вызов вне действия может привести к проблемам.

См. страницу кодекса register_taxonomy. Кроме того:

Лучше перестраховаться, чем потом жалеть при регистрации пользовательских таксономий для пользовательских типов записей. Используйте register_taxonomy_for_object_type() сразу после функции, чтобы связать их. В противном случае вы можете столкнуться с ситуациями, когда тип записи не прикреплен внутри фильтров, которые выполняются во время parse_request или pre_get_posts.

Поэтому лучше добавить:

register_taxonomy_for_object_type( 'item', 'product' );

В дополнение к чтению связанных страниц кодекса вы можете ознакомиться с:

Все это вместе должно помочь вам начать работу.



**Редактирование:**

Как я уже говорил в комментарии, у меня это работает, вот код:

add_action( 'init', 'custom_taxonomy_Item' );
function custom_taxonomy_Item()  {
    $labels = array(
        'name'                       => __('Элементы'),
        'singular_name'              => __('Элемент'),
        'menu_name'                  => __('Элементы'),
        'all_items'                  => __('Все элементы'),
        'parent_item'                => __('Родительский элемент'),
        'parent_item_colon'          => __('Родительский элемент:'),
        'new_item_name'              => __('Название нового элемента'),
        'add_new_item'               => __('Добавить новый элемент'),
        'edit_item'                  => __('Редактировать элемент'),
        'update_item'                => __('Обновить элемент'),
        'separate_items_with_commas' => __('Разделяйте элементы запятыми'),
        'search_items'               => __('Поиск элементов'),
        'add_or_remove_items'        => __('Добавить или удалить элементы'),
        'choose_from_most_used'      => __('Выбрать из наиболее используемых элементов'),
    );
    $args = array(
        'labels'                     => $labels,
        'hierarchical'               => true,
        'public'                     => true,
        'show_ui'                    => true,
        'show_admin_column'          => true,
        'show_in_nav_menus'          => true,
        'show_tagcloud'              => true,
    );
    register_taxonomy( 'item', 'product', $args );
    register_taxonomy_for_object_type( 'item', 'product' );
}
25 нояб. 2013 г. 22:46:29
Комментарии

Привет ialocin, спасибо за комментарий и подсказки. Я обновил код, как указано в начале, но "Item" все еще не отображается в меню WooCommerce

user1760110 user1760110
25 нояб. 2013 г. 22:53:21

Вам нужно добавить register_taxonomy_for_object_type, а не заменять register_taxonomy. У меня это работает в среде разработки. Кстати, атрибуты товаров тоже являются пользовательскими таксономиями. @user1760110

Nicolai Grossherr Nicolai Grossherr
25 нояб. 2013 г. 22:59:45

Это странно! У меня это не работает

user1760110 user1760110
25 нояб. 2013 г. 23:01:02

спасибо, теперь работает, НО он не добавляет никакие термины к товару. если нажать на элемент и попытаться добавить новый элемент, ничего не происходит!

user1760110 user1760110
25 нояб. 2013 г. 23:09:41

Не могу подтвердить это, у меня всё работает нормально. @user1760110

Nicolai Grossherr Nicolai Grossherr
25 нояб. 2013 г. 23:13:03

Спасибо за вашу помощь, я приму ваш комментарий как правильный ответ, однако мне нужно разобраться, почему термины не добавляются!

user1760110 user1760110
25 нояб. 2013 г. 23:16:57

@user1760110 У меня такая же проблема, код выше не добавляет новые термины. Вы нашли решение своей проблемы?

tommyf tommyf
24 апр. 2014 г. 11:48:58

+1 за register_taxonomy_for_object_type( 'item', 'product' );

Magico Magico
5 июн. 2014 г. 17:17:41

Заработало идеально после добавления обеих строк register_taxonomy( 'item', 'product', $args ); register_taxonomy_for_object_type( 'item', 'product' );

Ariful Haque Ariful Haque
26 окт. 2016 г. 13:42:04
Показать остальные 4 комментариев