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

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

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

wgetでベーシック認証をかける方法

こんにちは、最近スノボによく行っている岡田洋一です。

スノボに行ったりしている間はサーバが自動で処理をしてくれたりする機能、いわゆるバッチ処理があるんですが、こちらがエラーになっていたのでその対処。


shell> wget -O - http://www.example.com/action.php
--2014-01-22 19:23:10-- http://www.example.com/action.php
Resolving www.example.com (www.example.com)... 192.168.1.1
Connecting to www.example.com (www.example.com)|192.168.1.1|:80... connected.
HTTP request sent, awaiting response... 401 Authorization Required
Authorization failed.

見ればベーシック認証でコケている様子。前はどこからでもアクセスできたんですが、今はアクセス制限をしているのでその対応ですね。

wgetのオプションを調べると –userと–passwordで設定する様子。


shell> wget -O - --user=username --password=somepassword http://www.example.com/action.php

HTTP request sent, awaiting response... 401 Authorization Required
Reusing existing connection to www.example.co:80.
HTTP request sent, awaiting response... 200 OK
Length: 11206 (11K) 
Saving to: `STDOUT'

というわけでうまくいきました。

公開TeamSpeakのチャンネル整理について

こんにちは。

L2TPで公開しているTeamSpeak3サーバにおいてチャンネルの整理を行います。
L2TPのTeamSpeakサーバではみなさんに比較的自由にご利用頂いています。チャンネルの作成についても永久的チャンネルOK、サブチャンネルOKと特に制限を設けておりません。

そのためチャンネルが乱立しやすく、後から参加される際にはチャンネルが多くて見づらい!という事になりがちです。

つきましてはチャンネル見づらいよ状態を解消するために使われていないチャンネルを消去します。

使われていないチャンネルのみを消去しますので「僕らのチャンネルがいきなり消されちゃった!」という事はありません。ご安心下さい。

使われていないチャンネルの判別のために「チャンネル名の編集」をお願いします。
チャンネル名の編集は、一番トップのチャンネルの末尾に数字の1を付けて下さい

例えば元々「ぼくらのチャンネル」というチャンネル名でしたら、「ぼくらのチャンネル 1」としてください。
(7)でも -1でも、1という数字が入ってる事がわかれば消しません。
1は今月が1月ということにちなみます。
チャンネル名の編集は消去の日時までに行えば結構です。

Capture

というわけでチャンネルの消去は以下の条件に当てはまった場合に行われます。

  • 消去時に人が居ないチャンネル

  • 告知から消去までの間にチャンネル情報が書き換わっていない(チャンネル名の末尾に1が入っていないチャンネル)チャンネル。

チャンネル消去予定日時: 2014年1月27日 (月)  12:00~13:00

なおチャンネルの削除を行っても作成に制限はありません。
気がついたら消えていた、という場合にはお手数ですが再度作り直して下さい。

利用者の皆様には不便を掛けますがどうぞ仲良く使って下さい。