WordPressの記事でquery_postsをするとうまく通らないことがある

WordPressの記事でquery_posts、WP_Queryをするとうまく通らないことがある問題について。

PHPからWordPressの記事をいじってたんだけれどうまく取れないケースがあったのでメモ。

まずはうまく取れない条件について。

  1. カスタム投稿タイプの記事
  2. post_typeがfuture
  3. 上記に付して、投稿日時は2100-01-01みたいな未来
  4. post_name=hoge のように名前指定での取り出し

上記条件においてWP_Queryを利用するとうまく取れなかった。

ちなみに最後のpost_nameを指定しないとうまくいく。 うーんというところ。

$args = array(
  'name'=>'one_b38ptwd9', //コレを外すとうまくいく
  'post_type' => '1secwp',
  'post_status' => 'future',
);
$the_query = new WP_Query($args);
while ($the_query->have_posts()) {
  $the_query->the_post();
  // ここにこない
}

上記のコードだとうまくいかない。記事が存在するハズなのに記事が取得されない。WP_Queryインスタンスの$the_queryの持っている記事が0件となっていまう。
該当のコードを洗ってみる。wp-includes/query.phpの中盤あたりがそれ。

</pre>
if ( !empty($this->posts) && ($this->is_single || $this->is_page) ) {
  var_dump('hoge');
  exit;
  $status = get_post_status($this->posts[0]);
  $post_status_obj = get_post_status_object($status);
  var_dump($post_status_obj);
  //$type = get_post_type($this->posts[0]);
   if ( !$post_status_obj->public ) {
     if ( ! is_user_logged_in() ) {
     // User must be logged in to view unpublished posts.
     $this->posts = array();
   } else {
     if ( $post_status_obj->protected ) {
       // User must have edit permissions on the draft to preview.
       if ( ! current_user_can($edit_cap, $this->posts[0]->ID) ) {
         $this->posts = array();
       } else {

調べてみるとこのif文に入る条件となっている、

!empty($this->posts) && ($this->is_single || $this->is_page)

というのがおかしいことが原因。nameを指定市内と$this->is_singleがfalseなんだけど、nameを指定するとis_single=trueとなっちゃう。

そのせいで中盤にある

// User must be logged in to view unpublished posts.
$this->posts = array();

がひっかかってしまい、$this->postsが空っぽのarrayとなっちゃう。

というわけで解決方法は、この状態でログイン状態にしてやること、だ。

WordPressでログイン処理を強制的に行う方法
コードの最中にログインをする方法は上記に詳しい。

global $current_user;
$current_user = new WP_User(1);

これを加えてやっておしまい。

ちなみに記事が読めるか読めないか、みたいな詳細な権限は調べてないようなのでご注意。

コメントを残す