web-dev-qa-db-ja.com

wp_update_post()はpost_statusを更新しませんか?

フロントエンドからカスタム投稿タイプを挿入/更新するためにこのビットを使っています。日付はカスタムjqueryデートピッカーから設定されます。

    if (strtotime($date) < strtotime('tomorrow')) {
            $newpostdata['post_status'] = 'publish';
    } elseif (strtotime($date) > strtotime('today')) {
            $newpostdata['post_status'] = 'future';
            $newpostdata['post_date'] = date('Y-m-d H:i:s', strtotime($date));
    }

    if ('insert' == $operation) {
        $err = wp_insert_post($newpostdata, true);
    } elseif ('edit' == $operation) {
        $newpostdata['ID'] = $post_id;
        $err = wp_update_post($newpostdata);
    }

これは、最初に投稿を公開し、正しい日付でpublishまたはfutureとして正しく設定するときに機能します

同じ投稿を編集するとき、これは機能しませんpublishからfutureへ、あるいはその逆ではありません。投稿ステータスを除いて、他のすべては正しく更新されます。future_date

更新10月9日私はこれがバグかもしれないと思い始めています、 私はwp-hackersメーリングリストで会話を始めました 、これについて。リンクにいくつかのフレッシュインストールテストの結果があります。


その他の失敗した試み:

私はpost_statusの決定をwp_insert_post()に任せました:

elseif ('edit' == $operation) {
        $newpostdata['post_status'] = '';
        $newpostdata['ID'] = $post_id;
        $err = wp_update_post($newpostdata);
    }

そして、これはリクエストされた日付を維持しながら投稿ステータスをdraftに設定します。

また、 wp_transition_post_status() をもう一度呼び出してみました(wp_insert_post()内で1回呼び出されています)。

elseif ('edit' == $operation) {
        $newpostdata['ID'] = $post_id;
        $err = wp_update_post($newpostdata);
        wp_transition_post_status($old_status, $status, $post_id);
    }

しかしそれはまたうまくいかなかったようです。

私はここでアイデアが不足しています。何か手がかりはありますか?

4
moraleida

答えはもっと簡単ではありませんでした。

Wp-hackersリストの Otto で指摘されているように、問題は私がwp_update_post()を使うときpost_date_gmtを設定していないことでした。

最終的なコードは次のようになります。

if ( $post_date < strtotime( "tomorrow" ) ) {
        $status = 'publish';    
        $newpostdata['post_status'] = $status;
        $newpostdata['post_date'] = date( 'Y-m-d H:i:s',  $post_date );

        // Also pass 'post_date_gmt' so that WP plays Nice with dates
        $newpostdata['post_date_gmt'] = gmdate( 'Y-m-d H:i:s', $post_date );

    } elseif ( $post_date > strtotime( 'today' ) ) {
        $status = 'future';    
        $newpostdata['post_status'] = $status;
        $newpostdata['post_date'] = date( 'Y-m-d H:i:s', $post_date );

        // Also pass 'post_date_gmt' so that WP plays Nice with dates
        $newpostdata['post_date_gmt'] = gmdate( 'Y-m-d H:i:s', $post_date );
    }

    if ('insert' == $operation) {
        $err = wp_insert_post($newpostdata, true);
    } elseif ('edit' == $operation) {
        $newpostdata['ID'] = $post_id;
        $err = wp_update_post($newpostdata);
    }
10
moraleida

私はまたwp_update_post()を使って上のコードを試しました、しかしそれはWordPress 3.9でうまく働かない、それはpost_statusを空にしてそしてすべてのカスタムフィールドを削除しました。そこで私はwpdbクラスを使ってカスタムクエリを作成しました。これが皆様のお役に立つことを願っています。

$wpdb->query( 
    $wpdb->prepare( 
        "UPDATE $wpdb->posts SET post_status = 'draft' WHERE ID = %d", 
        $post_id 
    )
);    

これは私のlocalhostとhostingでもうまくいった。

2
mindlogixtech

$ newpostdata ['post_date'] =日付( 'Y-m-d H:i:s'、$ post_date);

これはphp 1970の最初の初期日付を返します。文字列を時間に変換するためにstrtotimeを使用します

$ newpostdata ['post_date'] =日付( 'Y-m-d H:i:s'、strtotime($ post_date));

1
Nayem Majhar

投稿ステータスは常に更新されています。ここでは、(作成されたフロントエンドエディタで)ユーザーを広告を下書きに変更して "一時停止"できるようにする方法の例を示します。

if ($action == 'pause') {
        $my_post = array();
        $my_post['ID'] = $aid;
        $my_post['post_status'] = 'draft';
        wp_update_post($my_post);
        $action_msg = __('Ad has been paused', 'mytheme');
}
1
Sethmatics