obtenir toutes les valeurs pour une clé de champ personnalisée (cross-post)

38

Je sais comment obtenir une valeur de champ personnalisé pour un message spécifique.

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

Ce dont j'ai besoin, c'est d'obtenir toutes les valeurs associées à une clé de publication personnalisée, dans toutes les publications .

Quelqu'un connaît un moyen efficace de le faire? Je ne voudrais pas parcourir en boucle tous les identifiants de post dans la base de données.

Exemple:

4 publie tous avec des valeurs différentes pour un champ personnalisé appelé "Humeur". 2 messages ont la valeur 'heureux', 1 article 'en colère' et 1 article a 'triste'

Je souhaite publier: tous les articles que nous avons publiés: deux auteurs heureux, un auteur en colère et un auteur triste.

Mais pour BEAUCOUP de messages.

Ce que je recherche, c'est soit:

  • une fonction WP pour l'obtenir. ou
  • une requête personnalisée pour obtenir cela aussi efficacement que possible.
posée mikkelbreum 15.02.2011 - 14:01
la source

7 réponses

53

Une approche possible serait d'utiliser l'une des méthodes d'assistance de la classe WPDB pour effectuer une requête méta plus précise. Toutefois, l’utilisation de certaines de ces fonctions pose un problème: vous ne récupérez généralement pas un simple tableau de données et devez généralement faire des références inutiles aux propriétés des objets, même si vous n’appelez qu’une colonne ou une ligne.

Bien sûr, toutes les fonctions ne sont pas identiques, et une mention délibérée est adressée à la méthode WPDB , get_col , qui renvoie un simple tableau à plat des données interrogées, i faites cette mention spécifiquement parce que l'exemple suivant fera appel à cette méthode.

WordPress - WPDB Sélection d'une colonne de données
$ wpdb- > get_col ( )

Voici un exemple de fonction qui interroge la base de données pour toutes les publications d'un type de publication choisi, d'un statut de publication et d'une clé méta spécifique (ou d'un champ personnalisé pour les moins avisés).

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;
}

Ainsi, par exemple, si vous souhaitez savoir quels messages ont une clé méta de classement , pour le type de message films et que vous souhaitez stocker ces informations dans une variable, voici un exemple d'appel ..

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

Si vous souhaitez uniquement imprimer ces données sur un écran, la fonction implode de PHP peut rapidement épisser ce simple tableau en lignes de données.

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

Vous pouvez également utiliser les données renvoyées pour déterminer le nombre de publications contenant ces méta-valeurs en effectuant une boucle simple sur les données renvoyées et en créant un tableau des nombres, par exemple.

$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.
*/

Cette logique pourrait être appliquée à divers types de données et étendue pour fonctionner de différentes manières. J'espère donc que mes exemples ont été utiles et simples à suivre.

    
réponse donnée t31os 15.02.2011 - 23:48
la source
14

Je voudrais juste ajouter une petite chose au code de t31os ci-dessus. J'ai remplacé "SELECT" par "SELECT DISTINCT" pour éliminer les entrées en double lorsque j'ai utilisé ce code moi-même.

    
réponse donnée Lehooo 05.06.2011 - 20:52
la source
9

Il n’est ni bon ni nécessaire d’utiliser le $ 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 );
    
réponse donnée Leon Francis Shelhamer 03.10.2015 - 23:32
la source
4

le moyen le plus rapide serait une requête SQL personnalisée et je ne suis pas sûr, mais vous pouvez essayer

$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
");

Si quelque chose, c'est un début.

    
réponse donnée Bainternet 15.02.2011 - 16:01
la source
3

Pour obtenir toutes les méta-valeurs à l'aide d'une clé méta

Vérifier le codex wp- > db wordpress

$values = $wpdb->get_col("SELECT meta_value
    FROM $wpdb->postmeta WHERE meta_key = 'yourmetakey'" );
    
réponse donnée Wiki 07.09.2013 - 13:07
la source
2

Il n'y a aucune raison pour que vous ne puissiez pas fusionner le code de t31os et celui de Bainternet pour obtenir une instruction préparée réutilisable (style wordpress) qui renvoie le nombre et les valeurs en une seule opération efficace.

C’est une requête personnalisée, mais elle utilise toujours la couche d’abstraction de base de données wordpress - ainsi, par exemple, le nom des tables n’importe pas vraiment, ou s’ils changent, c’est une instruction préparée, nous sommes donc beaucoup plus en sécurité Attaques SQL, etc.

Dans ce cas, je ne vérifie plus le type de message et j'exclus les chaînes vides:

    $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;

Dans ce cas particulier,

Ceci renverra un tableau d'objets comme suit:

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)
    
réponse donnée benz001 31.01.2012 - 14:23
la source
0

Utilisez les éléments suivants avec foreach

 $key = get_post_custom_values( 'key' );

Suppose que le nom de votre clé de champ personnalisé est

.     
réponse donnée Dev 29.07.2017 - 13:06
la source

Lire d'autres questions sur les étiquettes