web-dev-qa-db-ja.com

メタキー/値に基づいて投稿を取得する

カスタム投稿タイプ "custom_author"があります。これは、フィールドキー "chosen_author"のメタボックスドロップダウンを使用して新しい投稿を作成するときに選択されます。

これが私のwp_postmetaのようなものです。

enter image description here

13088は、「作者」13112が割り当てられているブログ投稿です。

私は以下を使って特定の作者によるすべての投稿を得ようとしています:

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

しかし、それはただ私のすべての投稿を返します。

私はいくつかのデバッグをしました:

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

そしてその出力

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

Meta_query配列を完全に無視します。

問題になるのであれば、これはループの外側で使用されます。

5
Titan

を使用して修正

新しいWP_Query($ args)の代わりにget_posts($ args)。

なぜだかわからない….

3
Titan

問題

データを次のように保存しているようです。

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

これがあなたにmeta_valueを与えるところ

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

あなたの最初の質問はあなたにエスケープ引用符を与えるでしょう:

LIKE '%\"13112\"%'

方法1

あなたが代わりに数字で著者配列を保存するならば:

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

対応するmeta_valueは次のようになります。

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

だからあなたはメタクエリを試すとき:

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

対応するSQL部分は次のようになります。

LIKE '%:13112;%'

代わりにこれを使ってみることができます。

方法2

別の方法は、エスケープされていない引用符をエスケープされていない引用符で削除することです。

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

しかし、私はそれをお勧めしません。

3
birgire

私も同様の問題に直面しましたが、クエリを正しく機能させることができませんでした。

データを書くために、私は以下のコードを使いました:

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

get_post_meta(post_id);を実行するとき、上記のコードはdbで以下を持続させました

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

私が書いたメタデータと一致するすべての投稿IDを取得したいのですが、空の配列が返されました。

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

任意の助けは大歓迎です。

0
Loc Pham