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

То, что вам нужно, называется meta_query
$args = array(
'meta_key' => 'custom-meta-key',
'meta_query' => array(
array(
'key' => 'cp_annonceur',
'value' => 'professionnel',
'compare' => '=',
)
)
);
$query = new WP_Query($args);

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

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

@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);

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

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

Есть два способа сделать это:
Перехватить основной запрос через
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' ); } );
Добавить дополнительный запрос
$second_loop = get_posts( array( 'meta_key' => 'cp_annonceur', 'meta_value' => 'professionnel', ) );
Более подробный пример можно найти в этом ответе.

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

Я использовал пользовательский запрос 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/

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

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

Вы имеете в виду что-то вроде 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"

Мы можем получить желаемый результат с помощью 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/

Вы можете легко получить записи с помощью встроенной функции 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' // Значение мета-поля
));

Попробуйте это, у меня работает
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);

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

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