web-dev-qa-db-ja.com

今日より古い場合に投稿ステータスを下書きに設定する方法

以前の質問では、スケジュール設定ではなく、保存時に公開されるように将来の日付付き投稿(カスタム投稿タイプ)を設定する必要がありました。

その日は「予定」されているので、もう一度ドラフトとして設定したいと思います。私はinitにフックして、投稿タイプをチェックする場合にそれをラップしようとしています。私はそれがサーバーの時間と比較し、それがサーバーの時間よりも古い場合はドラフトにステータスを設定すると考えました。

大まかな概要としては:

if custom post type
  get_the_time of post
  get the server time
  if post time is older than server time set status to draft
endif

ここで、私が取り組んでいるコードで更新します。

function sfn_show_expire(){
    global $wpdb;
    $server_time = date('mdy');
    $result = $wpdb->get_results("SELECT * FROM wp_posts WHERE post_type = 'show' AND post_status = 'publish'");
    if( !empty($result)) foreach ($result as $a){
        $show_time = get_the_time('mdy', $a->ID );
        if ( $server_time > $show_time){
            $my_post = array();
            $my_post['ID'] = $a->ID;
            $my_post['post_status'] = 'draft';
            wp_update_post( $my_post );
        }
    } // end foreach
}
add_action( 'init', 'sfn_show_expire' );

それは私が必要とする投稿を得てそして私にサーバー時間を与えていますが、私が言うことができる限りそれを過ぎて何もしていません。

2
curtismchale

あなたの問い合わせはあなたに投稿IDを与えているのではなく、それはあなたに全体の投稿を与えています。 SELECT *はすべての列、IDpost_statusなどを返します。したがって、この場合、$my_post['ID'] = $aを設定しても何も起こりません。

代わりに:$my_post['id'] = $a->ID;を使ってみてください。あなたがwp_update_post()を呼び出す前にそれはあなたのIDを正確にセットしなければならず、あなたはビジネスにいるべきです。

それ以外の点では、私はあなたがしていることに問題はないと思います...サイトがロードされるたびにデータベースを照会することは結局パフォーマンス問題を引き起こすかもしれないことを除いて。私は代わりにプロセスを自動化するために1時間ごとのchronジョブを設定したいと思います...そしてそれはユーザートラフィックに依存したり遅くなったりしません。

1
EAMann