現在下書きの投稿を予定しています。
function schedule() {
$postdate = date('2014-06-11 00:30:00');
$post = array(
'ID' => 11,
'post_status' => 'future',
'post_type' => 'post',
'post_author' => '1',
'ping_status' => 'closed',
'to_ping' => 'http://rpc.pingomatic.com/',
'post_date_gmt' => $postdate
);
wp_insert_post( $post );
}
add_action('wp_head', 'schedule');
問題の投稿には何も起こりませんが、それでもドラフトのままです。投稿をスケジュールする他の方法はありますか、それとも私のコードに問題がありますか?
Rarstが述べたように私はwp_update_post()
を使わなければなりませんでした、しかしそれから少しトリックがあります - 人はedit_date = true
もセットしなければなりません、さもなければそれは変な振る舞いをします。最終的なコードは次のようになります。
function schedule() {
$postdate = date('2014-06-11 01:00:00');
$postdate_gmt = date('2014-06-11 05:00:00');
$post = array(
'ID' => 11,
'post_status' => 'future',
'post_type' => 'post',
'post_author' => '1',
'ping_status' => 'closed',
'to_ping' => 'http://rpc.pingomatic.com/',
'post_date_gmt' => $postdate_gmt,
'post_date' => $postdate,
'edit_date' => 'true'
);
wp_update_post( $post, true );
}
add_action('wp_head', 'schedule');
テキストファイルを使用して、これが多くの投稿に対してどのように機能するかを示します。
Text File:
postid,server_time,gmt_time
postid,server_time,gmt_time
postid,server_time,gmt_time
postid,server_time,gmt_time
...
関数:
function schedule() {
$fh = @fopen( dirname( __FILE__ ) . '/schedule.txt', 'r' );
if ( $fh ) {
while ( ( $line = fgets( $fh ) ) !== false ) {
$ids = explode( ',', $line );
array_walk( $ids, 'trim' );
$postdate = date($ids[1]);
$postdate_gmt = date($ids[2]);
$post = array(
'ID' => $ids[0],
'post_status' => 'future',
'post_type' => 'post',
'post_author' => '5',
'ping_status' => 'closed',
'to_ping' => 'http://rpc.pingomatic.com/',
'post_date_gmt' => $postdate_gmt,
'post_date' => $postdate,
'edit_date' => 'true'
);
wp_update_post( $post, true );
}
}
}
add_action('wp_head', 'schedule');
これや他のスレッドを手伝ってくれたみんなに本当にありがとう!
wp_insert_post()
を使って existing postを操作してはいけません。それがwp_update_post()
の目的です。
失敗した場合のreturnに役に立たない0ではなくWP_Error
オブジェクトが含まれるように、どちらかに2番目の引数としてtrue
を渡すことができます。デバッグに非常に役立ちます。