如何更新除当前帖子以外的所有帖子(帖子__不在工作?)

时间:2017-09-15 作者:Jusi

我正在尝试在发布新帖子时取消发布(将post\\u status设置为draft)所有帖子(具体条件现在并不重要)。

以下是我目前拥有的:

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广告帖子都设置为草稿including 我正在保存/更新的那一个–尽管我已经检查了两次(post__not_in$args 并比较foreach循环中的ID)。

我知道$post_id 是正确的,因为我在函数的开头检查了post类型,效果很好。

有没有办法排除当前保存的帖子被更新?

2 个回复
最合适的回答,由SO网友:jdp 整理而成

有一种更优雅的方法可以使用全局$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,则只需访问数据库一次,即可修复所有帖子,而无需运行循环。注意,我将你的钩子改为特定于“rsc广告”帖子类型,因此它只会在这种帖子类型上触发。

SO网友:Asisten

您通过return结束了它,因此当找到不应该(或应该?)的帖子时,您的函数将停止要更新,请返回:

        if ( $published_ad->ID == $post_id ) return;
您可以:

            if ( $published_ad->ID != $post_id ) {
// unpublishing ads
}
要在前端获取当前帖子id,请执行以下操作:

get_the_ID();
在wp管理编辑器中时:

$_GET[\'post\'];
不要忘记添加条件is\\u admin,以确保在wp admin中执行此操作

结束

相关推荐