Получить термин по произвольной мета-информации термина и таксономии

1 июл. 2016 г., 19:18:44
Просмотры: 45K
Голосов: 8

Как получить термин по произвольной мета-информации термина и таксономии или как отфильтровать tax_query по мета-данным термина вместо slug/id?

function custom_pre_get_posts($query)
{
    global $wp_query;

    if ( !is_admin() && is_shop() && $query->is_main_query()  && is_post_type_archive( "product" )) 
    {
        // Получить термин по мете и таксономии
        $term = ???get_term_by_meta_and_taxonomy???('custom_meta_term','my_taxonomy');
        $t_id = $term['term_id'];
        $tax_query = array
        (
            array
            (
                'taxonomy' => 'my_taxoomy',
                'field' => 'id',
                'terms' => $t_id
            )
        );
        $query->set( 'tax_query', $tax_query );
    }
}
add_action( 'pre_get_posts', 'custom_pre_get_posts' );
0
Все ответы на вопрос 3
3
23

Попробуйте это:

$args = array(
'hide_empty' => false, // также получить термины, которые еще не используются
'meta_query' => array(
    array(
       'key'       => 'feature-group',
       'value'     => 'kitchen',
       'compare'   => 'LIKE'
    )
),
'taxonomy'  => 'category',
);
$terms = get_terms( $args );
5 сент. 2017 г. 13:45:47
Комментарии

Это должно быть принятым ответом, так как это лучшая практика для данного случая.

Jeremy Jeremy
25 апр. 2019 г. 17:39:01

Согласен, я подтвердил, что это позволяет получить термин по мета-ключу и значению термина. Убедитесь, что hide_empty установлен в false, если у вашего термина еще нет связанных записей.

Chris Stage Chris Stage
29 янв. 2020 г. 17:42:49

Также считаю, что это должен быть принятый ответ для данного случая

Tami Tami
2 авг. 2023 г. 01:48:04
0

Продолжая ответ ilgıt-yıldırım выше, оба выражения get_term_meta и $key == 'meta_value' должны содержать $term->term_id.

Вот полный пример, включая пользовательский запрос $wp_query:

$term_args = array( 'taxonomy' => 'your-taxonomy' );
$terms = get_terms( $term_args );

$term_ids = array();

foreach( $terms as $term ) {
    $key = get_term_meta( $term->term_id, 'term-meta-key', true );

    if( $key == 'term-meta-value' ) {
        // добавляем ID в массив
        $term_ids[] = $term->term_id;
    }
}

// Аргументы для цикла
$args = array(
'post_type' => 'posts',
'tax_query' => array(
    array(
        'taxonomy' => 'your-taxonomy',
        'terms'    => $term_ids,
         ),
    ),
);

// Запрос
$featured = new WP_Query( $args );
26 окт. 2018 г. 21:51:53
2

Вам нужно пройтись по каждому из терминов в основном условном запросе. Учитывая, что, скорее всего, будет несколько терминов с пользовательскими данными, вам затем нужно передать массив ID в ваш таксономический запрос.

Например, перебор каждого термина для проверки пользовательских метаданных:

$term_args = array(
    'taxonomy' => $taxonomy_name,
    );


$terms = get_terms( $term_args );

$term_ids = array();

foreach( $terms as $term ) {
    $key = get_term_meta( $term->ID, 'meta_key', true );
    if( $key == 'meta_value' ) {
        // добавляем ID в массив
        $term_ids[] = $term->ID;
    }
}

В результате вы получите переменную $term_ids, содержащую массив ID терминов, которые вам нужны. Вы можете передать её в ваш таксономический запрос.

2 июл. 2016 г. 08:21:16
Комментарии

get_term_meta( $term->ID, 'meta_key', true ); следует заменить на get_term_meta( $term->term_id, 'meta_key', true );, так как $term является объектом WP_Term.

Ilgıt Yıldırım Ilgıt Yıldırım
25 авг. 2017 г. 13:11:14

Для новичков: этот способ очень неэффективен и должен рассматриваться как крайний вариант. Обратите внимание на ответ с использованием meta_query, так как это более правильный подход.

Jeremy Jeremy
25 апр. 2019 г. 17:38:22