obteniendo todos los valores para una clave de campo personalizada (publicación cruzada)

38

Sé cómo obtener un valor de campo personalizado para una publicación específica.

get_post_meta($post_id, $key, $single);

Lo que necesito es obtener todos los valores asociados con una clave de publicación personalizada específica, en todas las publicaciones .

¿Alguien sabe de una manera eficiente de hacer esto? No me gustaría recorrer todos los ID de publicación en la base de datos.

Ejemplo:

4 publica todos con diferentes valores para un campo personalizado llamado "Estado de ánimo". 2 publicaciones tienen el valor 'happy', 1 publicación tiene 'angry' y 1 publicación tiene 'sad'

Quiero publicar: en todos los mensajes que tenemos: dos autores felices, uno enojado y uno triste.

Pero para MUCHAS publicaciones.

Lo que estoy buscando es:

  • una función WP para obtener esto. o
  • una consulta personalizada para obtener esto de la manera más eficiente posible.
pregunta mikkelbreum 15.02.2011 - 14:01

7 respuestas

53

Un posible enfoque sería utilizar uno de los métodos de ayuda en la clase WPDB para realizar una consulta basada en meta más refinada. Sin embargo, la advertencia para usar algunas de estas funciones es que, por lo general, no recupera una simple serie de datos y, por lo general, tiene que hacer referencias innecesarias a las propiedades de los objetos, incluso si solo está solicitando una columna o fila.

Por supuesto, no todas las funciones son iguales, y una mención intencional va al método WPDB , get_col , que devuelve una matriz plana simple de los datos que se solicitan, i haga esta mención específicamente porque el siguiente ejemplo recurrirá a este método.

WordPress - WPDB Seleccionando una columna de datos
$ wpdb- > get_col ( )

Aquí hay una función de ejemplo que consulta la base de datos para todas las publicaciones del tipo de publicación, el estado de la publicación y con una clave meta específica (o campo personalizado para los menos interesados en la técnica).

function get_meta_values( $key = '', $type = 'post', $status = 'publish' ) {

    global $wpdb;

    if( empty( $key ) )
        return;

    $r = $wpdb->get_col( $wpdb->prepare( "
        SELECT pm.meta_value FROM {$wpdb->postmeta} pm
        LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
        WHERE pm.meta_key = '%s' 
        AND p.post_status = '%s' 
        AND p.post_type = '%s'
    ", $key, $status, $type ) );

    return $r;
}

Entonces, por ejemplo, si te gusta saber qué publicaciones tienen una meta clave de rating , para el tipo de publicación movies y le gustaría almacenar esa información dentro de una variable, un ejemplo de tal llamada sería ...

$movie_ratings = get_meta_values( 'rating', 'movies' );

Si no quería hacer nada más que imprimir los datos en la pantalla, la función de implosión de PHP puede unir rápidamente esa simple matriz en líneas de datos.

// Print the meta values seperate by a line break
echo implode( '<br />', get_meta_values( 'YOURKEY' ));

También puede usar los datos devueltos para determinar cuántas publicaciones tienen estos valores meta haciendo un simple bucle sobre los datos devueltos y creando una matriz de los recuentos, por ejemplo.

$movie_ratings = get_meta_values( 'rating', 'movies' );
if( !empty( $movie_ratings ) ) {
    $num_of_ratings = array();
    foreach( $movie_ratings as $meta_value )
        $num_of_ratings[$meta_value] = ( isset( $num_of_ratings[$meta_value] ) ) ? $num_of_ratings[$meta_value] + 1 : 1;
}

/*
Result:
Array(
    [5] => 10
    [9] => 2
)
// ie. there are 10 movie posts with a rating of 5 and 2 movie posts with a rating of 9.
*/

Esta lógica podría aplicarse a varios tipos de datos y extenderse para funcionar de varias maneras diferentes. Así que espero que mis ejemplos hayan sido útiles y lo suficientemente simples como para seguirlos.

    
respondido por el t31os 15.02.2011 - 23:48
14

Me gustaría agregar una pequeña cosa al código de t31os que se encuentra arriba. Cambié "SELECCIONAR" a "SELECCIONAR DISTINCIÓN" para eliminar las entradas duplicadas cuando utilicé este código.

    
respondido por el Lehooo 05.06.2011 - 20:52
9

No es bueno o necesario usar el $ wpdb global:

// function to grab all possible meta values of the chosen meta key.
function get_meta_values( $meta_key,  $post_type = 'post' ) {

    $posts = get_posts(
        array(
            'post_type' => $post_type,
            'meta_key' => $meta_key,
            'posts_per_page' => -1,
        )
    );

    $meta_values = array();
    foreach( $posts as $post ) {
        $meta_values[] = get_post_meta( $post->ID, $meta_key, true );
    }

    return $meta_values;

}

$meta_values = get_meta_values( $meta_key, $post_type );
    
respondido por el Leon Francis Shelhamer 03.10.2015 - 23:32
4

la forma más rápida sería una consulta de SQL personalizada y no estoy seguro, pero puedes intentarlo

$wpdb->get_results("
  SELECT posts.* , COUNT(*) 'moodcount'
  FROM $wpdb->posts as posts
  JOIN $wpdb->postmeta as postmeta
  ON postmeta.post_id = posts.ID
  AND postmeta.meta_key = 'Mood'
  GROUP BY postmeta.meta_key
");

En todo caso, es un comienzo.

    
respondido por el Bainternet 15.02.2011 - 16:01
3

Para obtener todos los valores de metadatos mediante una clave de metadatos

Compruebe wp- > db wordpress codex

$values = $wpdb->get_col("SELECT meta_value
    FROM $wpdb->postmeta WHERE meta_key = 'yourmetakey'" );
    
respondido por el Wiki 07.09.2013 - 13:07
2

No hay ninguna razón por la que no pueda combinar t31os y el código de Bainternet para tener una declaración preparada reutilizable (estilo de wordpress) que devuelva el conteo y los valores en una operación eficiente.

Es una consulta personalizada, pero sigue usando la capa de abstracción de la base de datos de wordpress, por lo que, por ejemplo, no importa cuáles son los nombres de las tablas o si cambian, y es una declaración preparada, por lo que estamos mucho más seguros. Ataques SQL etc.

En este caso, ya no verifico el tipo de publicación y excluyo cadenas vacías:

    $r = $wpdb->get_results(  $wpdb->prepare( "
        SELECT pm.meta_value AS name, count(*) AS count  FROM {$wpdb->postmeta} pm
        LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
        WHERE pm.meta_key = '%s'
        AND pm.meta_value != '' 
        AND p.post_type = '%s'
        GROUP BY pm.meta_value
        ORDER BY pm.meta_value          
        ", $key, $type) 
        );
    return $r;

En este particular es

Esto devolverá una matriz de objetos así:

array  
 0 => 
 object(stdClass)[359]
  public 'name' => string 'Hamish' (length=6)
  public 'count' => string '3' (length=1)
 1 => 
 object(stdClass)[360]
  public 'name' => string 'Ida' (length=11)
  public 'count' => string '1' (length=1)
 2 => 
 object(stdClass)[361]
  public 'name' => string 'John' (length=12)
  public 'count' => string '1' (length=1)
    
respondido por el benz001 31.01.2012 - 14:23
0

Usa lo siguiente con foreach

 $key = get_post_custom_values( 'key' );

Supone que el nombre de su clave de campo personalizado es

    
respondido por el Dev 29.07.2017 - 13:06

Lea otras preguntas en las etiquetas