web-dev-qa-db-fra.com

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

Je sais comment obtenir une valeur de champ personnalisé pour un article 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 sait d'un moyen efficace de le faire? Je ne voudrais pas parcourir toutes les identifiants de post dans la base de données.

Exemple:

4 publications, toutes 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 veux publier: dans tous les articles que nous avons: 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.
40
mikkelbreum

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 a pour inconvénient que 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 donnée à la méthodeWPDB, get_col qui renvoie un simple tableau plat des données interrogées. 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 derating, pour le type de messagefilmset vous 'aimerais stocker cette information à l'intérieur d'une variable, un exemple d'un tel appel serait ..

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

Si vous ne voulez rien faire d’autre que d’imprimer ces données à l’écran, la fonction implode de PHP peut rapidement fusionner 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 ayant 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.

56
t31os

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

14
Lehooo

Il n'est ni bon ni nécessaire d'utiliser la somme globale $ wpdb:

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

le moyen le plus rapide serait une requête personnalisée SQL 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 alors c'est un début.

4
Bainternet

Pour obtenir toutes les méta-valeurs par une méta-clé

Vérifiez wp-> db wordpress codex

$values = $wpdb->get_col("SELECT meta_value
    FROM $wpdb->postmeta WHERE meta_key = 'yourmetakey'" );
3
Wiki

Il n'y a aucune raison pour que vous ne puissiez pas fusionner t31os et le code 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'a pas d'importance, ou si elles changent, il s'agit d'une instruction préparée, nous sommes donc beaucoup plus sûrs des 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

Cela retournera un tableau d'objets comme ceci:

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)
2
benz001

Utilisez ce qui suit avec foreach

 $key = get_post_custom_values( 'key' );

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

0
Dev