web-dev-qa-db-fra.com

Obtenir des messages basés sur la méta clé/valeur

J'ai un type de message personnalisé "custom_author" qui est sélectionné lors de la création d'un nouveau message à l'aide d'un menu déroulant metabox avec la clé de champ "selected_author".

Voici à quoi ressemble mon wp_postmeta:

enter image description here

Où 13088 est l'article de blog auquel "auteur" 13112 a été attribué.

J'essaie d'obtenir tous les messages d'un auteur particulier en utilisant les éléments suivants:

$args = array(
        'post_type'     => 'post',
        'post_status'   => 'publish',
        'meta_query' => array(
            array(
                'key' => 'chosen_author',
                'value' => '13112' (tried with and without quotes)
            )
        )
    );

    $getPosts = new WP_Query($args);

Mais cela ne fait que renvoyer TOUTES mes publications.

J'ai fait du débogage:

$getPosts = new WP_Query($args);
echo $GLOBALS['wp_query']->request;

et cette sortie

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND (wp_posts.post_author != 0) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10

Ignorer complètement le tableau meta_query!

Si cela compte, il est utilisé en dehors de la boucle

5
Titan

Fixé en utilisant

get_posts ($ args) au lieu du nouveau WP_Query ($ args);

Aucune idée pourquoi ...

3
Titan

Le problème

Il semble que vous sauvegardiez les données en tant que:

$a = array( "13112" );
update_post_meta( $post_id, "article_author", $a);

où cela vous donnera le meta_value

a:1:{i:0;s:5:"13112";}

Votre première requête vous donnera des citations échappées:

LIKE '%\"13112\"%'

Méthode 1

Si vous enregistrez le tableau d'auteur avec des nombres à la place:

$a = array( 13112 );
update_post_meta( $post_id, "article_author", $a);

alors le meta_value correspondant sera

a:1:{i:0;i:13112;}

Alors, quand vous essayez la méta requête:

 'meta_query' => array(
            array(
                'key' => 'article_author',
                'value' => ':13112;',
                'compare' => 'LIKE'
            )
    )

la partie SQL correspondante sera

LIKE '%:13112;%'

Vous pouvez essayer d'utiliser ceci à la place.

Méthode 2

Une autre méthode consiste à supprimer les guillemets avec des guillemets non échappés:

add_filter('posts_where','my_posts_where');
$getPosts = new WP_Query($args);
remove_filter('posts_where','my_posts_where');

function my_posts_where($where){    
    $where = str_replace('\"', '"', $where);    
    return $where;  
}

mais je ne le recommande pas.

3
birgire

Moi aussi, j'ai fait face à un problème similaire, mais la requête ne pouvait pas fonctionner correctement.

Pour écrire les données, j'ai utilisé les codes suivants:

$post_id = 2;
$user_key = 'ldp_system_follows_user_1';
$user_data_new = array(
    'followed'    => 'nofollowed'
);

update_post_meta($post_id, $user_key, $user_data_new);

Le code ci-dessus a conservé les éléments suivants dans la base de données lors de l'exécution de get_post_meta(post_id);

{
  "ldp_system_follows_user_1": [
    "a:1:{s:8:\"followed\";s:8:\"followed\";}"
  ]
}

Je voulais récupérer tous les identifiants de publication qui correspondent aux métadonnées que j'ai écrites, mais ils ont renvoyé un tableau vide.

$args = array(
        'post_type'     => 'post',
        'post_status'   => 'publish',
        'meta_query'    => array(
                                array(
                                    'key'   => $user_key,
                                    'value' => $user_data_new,
                                    'compare'   => 'LIKE'
                                ))
    );

    return  get_posts($args);

Toute aide serait grandement appréciée.

0
Loc Pham