Получить записи по значению мета-поля

11 мая 2014 г., 22:56:24
Просмотры: 155K
Голосов: 50

Я хотел бы вывести список всех записей, у которых есть ключ cp_annonceur со значением professionnel.

1
Комментарии

Пожалуйста, учитывайте, что от вас ожидается, что вы изучили проблему и попытались решить её до публикации вопроса. Если бы вы не были новичком здесь, я бы, вероятно, проголосовал против вашего вопроса и просто прошёл мимо, вместо того чтобы отвечать на него. В духе "Добро пожаловать в Stack" это ваш бесплатный подарок. Пожалуйста, ознакомьтесь с [ask] для будущих вопросов.

s_ha_dum s_ha_dum
11 мая 2014 г. 23:05:35
Все ответы на вопрос 6
6
81

То, что вам нужно, называется meta_query

$args = array(
   'meta_key' => 'custom-meta-key',
   'meta_query' => array(
       array(
           'key' => 'cp_annonceur',
           'value' => 'professionnel',
           'compare' => '=',
       )
   )
);
$query = new WP_Query($args);

Вся необходимая информация есть в Кодексе.

11 мая 2014 г. 23:05:26
Комментарии

@Beginner : если это решило проблему, отметьте ответ как "Принятый". Найдите галочку возле стрелок голосования слева.

s_ha_dum s_ha_dum
11 мая 2014 г. 23:35:35

По какой-то причине использование new WP_Query($args) с последующим вызовом get_posts у меня не работает. Однако, если передать массив $args напрямую в функцию get_posts как аргумент, то всё работает.

Kunal Kunal
6 мая 2020 г. 00:24:03

@Kunal Вам не нужно вызывать get_posts. Используйте код выше и получайте записи так: $query->posts. Он должен вернуть массив. Не забудьте прочитать ссылку в комментарии, так как в коде чего-то не хватает: $args = array( 'post_type' => 'your-cpt', 'meta_key' => 'your-meta', 'meta_query' => array( array( 'key' => 'cp_annonceur', 'value' => 'professionnel', 'compare' => '=', ) ) ); $query = new WP_Query($args);

BonisTech BonisTech
14 янв. 2021 г. 02:32:05

@s_ha_dum небольшая синтаксическая правка - пропущена , после 'custom-meta-key'. Хотел бы исправить, но нельзя внести правку всего в 1 символ...

Steven Steven
29 апр. 2021 г. 15:57:12

В чем разница между meta_key и key?

Michael Rogers Michael Rogers
14 янв. 2022 г. 13:20:26

Это было бы неправильно. Зачем передавать и meta_key, и key? В документации WP Query это не так описано. Вероятно, вы хотели написать что-то вроде: 'post_type' => 'product', 'meta_query' => array( array( 'key' => 'color', 'value' => 'blue', 'compare' => 'NOT LIKE', ), ), ?

User User
24 сент. 2022 г. 10:22:07
Показать остальные 1 комментариев
3
16

Есть два способа сделать это:

  1. Перехватить основной запрос через pre_get_posts:

    add_action( 'pre_get_posts', function( $query )
    {
        // работаем только с основным запросом
        if ( ! $query->is_main_query() )
            return;
    
        $query->set( 'meta_key',   'cp_annonceur' );
        $query->set( 'meta_value', 'professionnel' );
    } );
    
  2. Добавить дополнительный запрос

    $second_loop = get_posts( array(
        'meta_key'   => 'cp_annonceur',
        'meta_value' => 'professionnel',
    ) );
    

Более подробный пример можно найти в этом ответе.

11 мая 2014 г. 23:08:01
Комментарии

Хорошо знать короткий способ с использованием get_posts()

Andrew Welch Andrew Welch
26 янв. 2017 г. 18:06:09

Как это сделать с несколькими meta key/values?

G-J G-J
10 апр. 2020 г. 01:57:44

@G-J, возможно, вам стоит взглянуть на этот пример.

kaiser kaiser
15 апр. 2020 г. 18:18:04
3
12

Я использовал пользовательский запрос SELECT (возможно, для лучшей производительности)

$posts = $wpdb->get_results("SELECT * FROM $wpdb->postmeta
WHERE meta_key = 'cp_annonceur' AND  meta_value = 'professionnel' LIMIT 1", ARRAY_A);

Вдохновлено статьёй https://tommcfarlin.com/get-post-id-by-meta-value/

28 янв. 2016 г. 16:40:33
Комментарии

Это может дать лучшую производительность, но полностью отбрасывает идею использования функций WordPress для поиска (и кеширования) данных. И также, что произойдет, если WordPress решит изменить структуру таблиц? :)

Erenor Paz Erenor Paz
3 мар. 2017 г. 12:11:58

@ErenorPaz Я понимаю, о чем вы говорите, но такой подход упростит работу, если у вас несколько мета-ключей/значений в качестве критериев... Есть ли официальный способ обработки множественных критериев?

G-J G-J
10 апр. 2020 г. 01:59:57

Вы имеете в виду что-то вроде WHERE metatable1.meta_key = 'cp_annonceur' AND metatable1.meta_value = 'professionnel' AND metatable2.meta_key = 'cp_other_meta' AND metatable2.meta_value = 'other_value'? (Обратите внимание, что я предполагаю соединение с той же таблицей posts_meta, используя два имени metatable1 и metatable2). Этого можно достичь, добавив поле meta_query (в виде массива) к запросу. Посмотрите: https://developer.wordpress.org/reference/classes/wp_query/#order-orderby-parameters и перейдите к параграфу "‘orderby’ with multiple ‘meta_key’s"

Erenor Paz Erenor Paz
10 апр. 2020 г. 14:19:09
3

Мы можем получить желаемый результат с помощью Meta query в WordPress:

// meta_key 'diplay_on_homepage' с meta_value 'true'
$cc_args = array(
    'posts_per_page'   => -1,
    'post_type'        => 'post',
    'meta_key'         => 'cp_annonceur',
    'meta_value'       => 'professionnel'
);
$cc_query = new WP_Query( $cc_args );

Для более подробного руководства по работе с meta query читайте этот блог: http://www.codecanal.com/get-posts-meta-values/

4 окт. 2017 г. 08:46:42
Комментарии

Можно узнать, почему значение post_per_page равно -1?

Abhay Abhay
27 апр. 2018 г. 08:07:56

@AbhayGawade Этот параметр позволяет ограничить максимальное количество результатов, -1 означает отсутствие ограничений.

Kush Kush
20 июн. 2018 г. 20:49:03

Спасибо, работает отлично. :)

Arman H Arman H
23 февр. 2022 г. 08:05:08
0

Вы можете легко получить записи с помощью встроенной функции WordPress под названием get_posts Подробнее о функции get_posts можно узнать здесь https://developer.wordpress.org/reference/functions/get_posts/

$posts = get_posts(array(
    'numberposts'   => -1, // Количество постов (-1 - все посты)
    'post_type'     => 'post', // Тип записи
    'meta_key'      => 'cp_annonceur', // Мета-ключ
    'meta_value'    => 'professionnel' // Значение мета-поля
));
31 мая 2021 г. 18:48:12
2

Попробуйте это, у меня работает

global $wpdb;
$meta_key = '_request_body';

$data = $wpdb->get_results($wpdb->prepare( "SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key = %s", $meta_key) , ARRAY_N  );

$result = [];
foreach($data as $array){
    $result[] = $array[0];
}

print_r($result);
20 янв. 2021 г. 12:20:12
Комментарии

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

Rup Rup
20 янв. 2021 г. 18:19:34

Вы никогда не должны обращаться к базе данных для таких базовых вещей WordPress, как получение записей. Всегда используйте абстрагированный WP-API, который выполняет всю тяжелую работу за вас и гарантирует, что ваш код будет работать, даже если что-то изменится внутри системы.

Zarko Jovic Zarko Jovic
18 нояб. 2022 г. 22:03:39