web-dev-qa-db-ja.com

現在の投稿以外のすべての投稿を更新する方法(post__not_inが動作しませんか?)

新しい記事が公開されたら(post_statusをドラフトに設定して)、新しい投稿が公開されようとしています。

これが私が現在持っているものです:

function rsc_unpublish_all_ads( $post_id ) {

    // don't do anything if the post is not an ad
    $post_type = get_post_type($post_id);
    if ( 'rsc-ads' != $post_type ) return;

    // select all ads other than the current one
    $args = array(
        'posts_per_page' => -1,
        'post__not_in' => array($post_id),
        'post_type' => 'rsc-ads',
        'post_status' => 'publish',
    );

    $published_ads = get_posts( $args );

    if ( !empty($published_ads) ) {

        // set each of the published ads as draft
        foreach ($published_ads as $published_ad) {

            // check again just for the sake of it?
            if ( $published_ad->ID == $post_id ) return;

            $unpublish = array(
                'ID' => $published_ad->ID,
                'post_status' => 'draft'
            );

            wp_update_post( $unpublish );
        }

    }

}

add_action( 'save_post', 'rsc_unpublish_all_ads' );

Rsc-adsの投稿はすべて、ドラフトに保存されているものを含めて設定されています。 post__not_in$argsとforeachループのIDを比較します。

私は$post_idが正しいことを知っています。なぜなら私は私の関数の冒頭でpost typeをチェックしていてそれはうまく働くからです。

現在保存中の投稿を更新から除外する方法はありますか。

1
Jusi

グローバルな$wpdbを使って投稿を更新するためのもっとエレガントな方法があります。

function rsc_unpublish_all_ads( $post_id, $post, $update ) {

// select all ads other than the current one
$args = array(
    'nopaging' => true,
    'post__not_in' => array($post_id),
    'post_type' => 'rsc-ads',
    'post_status' => 'publish',
    'fields'=>'ids'
);

$query = new WP_Query($args);

$published_ads = $query->posts;//array of post ids

 if ( !empty($published_ads) ) {

    global $wpdb;

    $ids = implode(',', $published_ads);

    $wpdb->query("UPDATE $wpdb->posts SET post_status = 'draft' WHERE ID IN ($ids)");

 }

}
    add_action( 'save_post_rsc-ads', 'rsc_unpublish_all_ads', 10, 3 );

関数がまだ実行されている間にwp_update_post()の呼び出しに問題があったと思います。この実装では、$queryが投稿IDを正しく返している場合は、データベースに1回アクセスして、ループを実行せずにすべての投稿を修正します。注意私はあなたのフックを "rsc-ads"投稿タイプに固有のものに変更したので、この投稿タイプでのみ起動されます。

0
jdp

あなたはリターンでそれを終えました、それであなたの機能は更新されるべきでない(あるいはそうすべきである)ポストを見つけたときに代わりにそれを返します:

        if ( $published_ad->ID == $post_id ) return;

あなたはできる:

            if ( $published_ad->ID != $post_id ) {
// unpublishing ads
}

フロントエンドの現在の投稿IDを取得します。

get_the_ID();

wPの管理エディタにいる間:

$_GET['post'];

wp adminでこれを確実に実行するために、条件is_adminの追加を忘れないでください。

0
Asisten