Obtener entradas por valor meta
Me gustaría listar todas las entradas que tengan una clave cp_annonceur
con el valor professionnel
.

Lo que estás solicitando es un 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 : si esto resolvió el problema, por favor márcalo como "Aceptado". Busca la marca de verificación cerca de las flechas de votación a la izquierda.

Por alguna razón, usar new WP_Query($args)
y luego llamar a get_posts
no funciona para mí. Sin embargo, pasar directamente el array $args
como argumento a la función get_posts
sí funciona.

@Kunal No necesitas llamar a get_posts.
Usa el código de arriba y obtén las publicaciones así: $query->posts
. Debería devolver un array.
No olvides leer el enlace en el comentario, ya que hay algo que falta en el código:
$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 corrección menor de sintaxis - falta una ,
después de 'custom-meta-key'
. Habría editado, pero no es posible hacer una edición de solo 1 carácter...

Esto estaría mal. ¿Por qué pasarías meta_key y luego key?
No es como lo describe la Documentación de WP Query.
Probablemente lo que querías decir es algo como:
'post_type' => 'product',
'meta_query' => array(
array(
'key' => 'color',
'value' => 'blue',
'compare' => 'NOT LIKE',
),
),
?

Existen dos formas de hacerlo:
Interceptar la consulta principal con
pre_get_posts
:add_action( 'pre_get_posts', function( $query ) { // solo manejar la consulta principal if ( ! $query->is_main_query() ) return; $query->set( 'meta_key', 'cp_annonceur' ); $query->set( 'meta_value', 'professionnel' ); } );
Añadir una consulta adicional
$second_loop = get_posts( array( 'meta_key' => 'cp_annonceur', 'meta_value' => 'professionnel', ) );
Un ejemplo más detallado se puede encontrar en esta respuesta.

@G-J quizás quieras echar un vistazo a este ejemplo.

Utilicé una consulta SELECT personalizada (puede tener mejor rendimiento)
$posts = $wpdb->get_results("SELECT * FROM $wpdb->postmeta
WHERE meta_key = 'cp_annonceur' AND meta_value = 'professionnel' LIMIT 1", ARRAY_A);
Inspirado en https://tommcfarlin.com/get-post-id-by-meta-value/

Podría tener mejor rendimiento, pero descarta por completo la idea de usar las funciones de WordPress para buscar (y cachear) datos. Además, ¿qué pasaría si WP decide cambiar la estructura de las tablas? :)

@ErenorPaz Entiendo lo que dices, pero esta forma lo haría más fácil si tienes múltiples meta claves/valores como criterio... ¿Hay una forma oficial de manejar múltiples criterios?

¿Te refieres a algo como WHERE metatable1.meta_key = 'cp_annonceur' AND metatable1.meta_value = 'professionnel' AND metatable2.meta_key = 'cp_other_meta' AND metatable2.meta_value = 'other_value'
? (Nota que supongo que hacemos un join en la misma tabla posts_meta usando dos nombres metatable1
y metatable2
). Esto se puede lograr añadiendo el campo meta_query
(como un array) a la consulta. Echa un vistazo a: https://developer.wordpress.org/reference/classes/wp_query/#order-orderby-parameters y ve al párrafo "‘orderby’ with multiple ‘meta_key’s"

Podemos obtener el resultado deseado con la consulta meta de WordPress:
// la meta_key 'diplay_on_homepage' con el 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 );
Para una guía más detallada sobre consultas meta sigue este blog: http://www.codecanal.com/get-posts-meta-values/

Puedes obtener fácilmente las publicaciones usando la función incorporada de WordPress llamada get_posts Puedes encontrar más detalles sobre get_posts aquí https://developer.wordpress.org/reference/functions/get_posts/
$posts = get_posts(array(
'numberposts' => -1, // -1 para obtener todas las publicaciones
'post_type' => 'post', // Tipo de publicación: post
'meta_key' => 'cp_annonceur', // Clave meta personalizada
'meta_value' => 'professionnel' // Valor meta a buscar
));

Prueba esto, me funciona a mí
global $wpdb;
$meta_key = '_request_body';
// Obtener todos los valores meta distintos para la clave especificada
$data = $wpdb->get_results($wpdb->prepare( "SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key = %s", $meta_key) , ARRAY_N );
// Preparar array para los resultados
$result = [];
foreach($data as $array){
$result[] = $array[0]; // Añadir cada valor meta al array de resultados
}
// Mostrar los resultados
print_r($result);

Eso listaría los valores distintos posibles, lo cual no es exactamente lo que pregunta la pregunta.
