一次又一次地操纵帖子类别

时间:2017-06-08 作者:DᴀʀᴛʜVᴀᴅᴇʀ

在阅读了几篇关于在给定时间内操纵帖子类别的帖子后,我想创建一个插件,在一个日期后操纵帖子。我最初的推荐信是六年前写的:“Plugin for changing a post\'s category based on it\'s post date?“但我引用了几篇关于操纵的帖子:

但是,它并没有删除该类别并添加新类别:

一零

function check_if_cat_has_reached_time() {
    // test if term exists and if doesn\'t return
    $test_term1 = term_exists(\'Uncategorized\', \'category\');
    if ($test_term1 !== 0 && $test_term1 !== null) :
        // $default_cat = get_term_by(\'id\', \'Uncategorized\', \'category\');
        $default_cat = get_cat_ID(\'uncategorized\');
    else :
        return;
    endif;

    // test if term exists and if doesn\'t return
    $test_term2 = term_exists(\'failed\', \'category\');
    if ($test_term2 !== 0 && $test_term2 !== null) :
        $new_cat = get_cat_ID(\'failed\');
    else :
        return;
    endif;

    global $post;

    // the Post ID
    $the_ID = $post->ID;

    // Post creation time in epoch
    // $post_creation   = get_the_time(\'U\',$the_ID);
    // current time in epoch
    $current_time = time();

    // two years in epoch
    $two_years = 31556926*2;

    // post time plus two years
    $post_plus_two = (int)$two_years + (int)get_the_time(\'U\',$the_ID);

    if ($current_time >= $post_plus_two && has_category($default_cat,$the_ID)) :
        wp_remove_object_terms($the_ID, $default_cat, \'category\');
        $update_post_cat = array(
            \'post_category\' => array($new_cat),
        );
        wp_insert_post($update_post_cat);
    endif;
}
add_action(\'save_post\', \'check_if_cat_has_reached_time\');
 有什么原因吗wp_remove_object_terms() 不起作用?我读完后用了这个Remove specific category from a post.  

所以我的问题是:

我是否正确删除了类别


EDIT:

下面是我在主题函数中尝试实现的答案。php,但它仍然不起作用。我正在使用默认主题WP Test. 在使用函数之前,我确保使用以下内容创建类别:

function create_foo_category() {
    wp_insert_term(
        \'Foo\',
        \'category\',
        array(
            \'description\'   => \'This is the Foo\',
            \'slug\'          => \'foo\'
        )
    );
}
add_action(\'after_setup_theme\', \'create_foo_category\');
然后用于bar:

function create_bar_category() {
    wp_insert_term(
        \'Bar\',
        \'category\',
        array(
            \'description\'   => \'This is the bar\',
            \'slug\'          => \'bar\'
        )
    );
}
add_action(\'after_setup_theme\', \'create_bar_category\');
我试图通过以下方式操纵提供的答案:

function check_if_cat_has_reached_time() {
    global $post; 

    $the_ID = $post->ID;

    if (!wp_is_post_revision($the_ID)) {

    // unhook this function so it doesn\'t loop infinitely
    remove_action(\'save_post\', \'check_if_cat_has_reached_time\');

    // test if term exists and if doesn\'t return
    $check_default_cat = term_exists(\'Foo\', \'category\');
    if ($check_default_cat !== 0 && $check_default_cat !== null) {
        $default_cat = get_cat_ID(\'foo\');
    } else {
        return;
    }

    // test if term exists and if doesn\'t return
    $check_new_cat = term_exists(\'Bar\', \'category\');
    if ($check_new_cat !== 0 && $check_new_cat !== null) {
        $new_cat = get_cat_ID(\'bar\');
    } else {
        return;
    }

    // current time in epoch
    $current_time = time();

    // two years in epoch
    $two_years = 31556926*2;

    // post time plus two years
    $post_plus_two = (int)$two_years + (int)get_the_time(\'U\',$the_ID);

    if ($current_time >= $post_plus_two && has_category($default_cat,$the_ID)) {
        wp_remove_object_terms($the_ID, $default_cat, \'category\');
        $args = array(
            \'ID\'            => $the_ID,
            \'post_category\' => array($new_cat),
        );
        wp_update_post($args);
    }

    // re-hook this function
    add_action(\'save_post\', \'check_if_cat_has_reached_time\');
    }
}
add_action(\'publish_post\', \'check_if_cat_has_reached_time\');
<小时>

EDIT:

在与一些人交谈后,我认为有点不清楚上述内容的目的是什么。我希望修改帖子,而不是像每天都有活动这样的内容。在进一步讨论这个问题后,我意识到wp_schedule_event() 我将测试并编辑它。

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

您当前的函数运行得很好,但它连接到一个帖子更新挂钩上,因此您需要实际编辑/更新帖子才能运行。如果希望在指定的时间后自动修改帖子,则需要设置计划的事件。我可以想出两种方法来安排你的日程。。。

1。检查我们可以使用的所有(相关)帖子的重复事件wp_schedule_event() 以指定的间隔在挂钩上运行:

// a custom hook to schedule
add_action( \'wpse_269529_check_posts\', \'wpse_269529_check_posts_cats\' );

// make sure the event hasn\'t been scheduled
if( !wp_next_scheduled( \'wpse_269529_check_posts\' ) ) {

    // Schedule the event
    wp_schedule_event( time(), \'daily\', \'wpse_269529_check_posts\' );
}
参数wp_schedule_event() 是(按顺序);第一个事件应该何时运行(我们可以通过time() 从现在开始运行),他们应该多久运行一次(每小时一次、两天一次或每天一次),还有要跑的钩子。你也可以传递一些参数,但我们不需要。

我们还使用wp_next_scheduled() 检查事件是否尚未安排。

然后我们需要在这个钩子上运行的函数。我们可以使用它循环浏览所有包含要替换类别的帖子,然后使用新类别更新这些帖子:

function wpse_269529_check_posts_cats() {

    //categories
    $old_cat = get_cat_ID( \'foo\' );
    $new_cat = get_cat_ID( \'bar\' );

    // get all posts with the required category
    $args = array( \'posts_per_page\' => -1, \'category\' => $old_cat );
    $myposts = get_posts( $args );

    // loop through all posts and update with new category
    foreach ( $myposts as $mypost ) {
        $args = array(
            \'ID\'            => $mypost->ID,
            \'post_category\' => array( $new_cat ),
        );
        wp_update_post($args);
    }
}
你提到了性能,这会循环浏览该类别的所有帖子,所以这可能不是最好的选择。。。

二,。您可以使用wp_schedule_single_event(), 并在创建帖子时创建时间表(注意,这只适用于新帖子,而不适用于现有帖子)。将函数挂接到publish_post 这将设置时间表:

// runs when a post is published
add_action( \'publish_post\', \'wpse_269529_schedule_post_check\' );

function wpse_269529_schedule_post_check( $post_id ) {

    // set the time when the event should be scheduled
    $timestamp = strtotime( \'+2 years\' );

    // Schedule the event
    wp_schedule_single_event( $timestamp, \'wpse_269529_check_post\', array( $post_id ) );    
}
现在,因为我们把它挂在publish_post, 我们可以将post ID传递给计划的事件,并在此基础上更新该post(记住将ID的操作挂钩上的参数数量设置为“1”):

// a custom hook to schedule
add_action( \'wpse_269529_check_post\', \'wpse_269529_check_post_cats\', 10, 1 );

// replace post categories
function wpse_269529_check_post_cats( $post_id ) {

    //categories
    $old_cat = get_cat_ID( \'foo\' );
    $new_cat = get_cat_ID( \'bar\' );

    // check for the old category
    if ( has_category( $old_cat, $post_id ) ) {
        // update post with new category
        $args = array(
            \'ID\'            => $post_id,
            \'post_category\' => array( $new_cat ),
        );
        wp_update_post($args);
    }
}

您可以将两者结合使用,并在插件或主题激活上循环浏览所有现有帖子(或其他取决于您何时、为什么以及如何执行此操作的内容),然后为所有新帖子安排每篇帖子的更新。

SO网友:Johansson

这个save_post hook将post的ID传递给其回调函数,因此不需要使用get_the_ID().

如果您使用wp_insert_post(), 每次保存帖子时,都会向数据库插入一篇新帖子。相反,使用wp_update_post():

function check_if_cat_has_reached_time($post_id) {
    if ( ! wp_is_post_revision( $post_id ) ){

        // unhook this function so it doesn\'t loop infinitely
        remove_action(\'save_post\', \'check_if_cat_has_reached_time\');

        // test if term exists and if doesn\'t return
        $check_default_cat = term_exists(\'Uncategorized\', \'category\');
        if ($check_default_cat !== 0 && $check_default_cat !== null) {
            $default_cat = get_cat_ID(\'uncategorized\');
        } else {
            return;
        }

        // test if term exists and if doesn\'t return
        $check_new_cat = term_exists(\'failed\', \'category\');
        if ($check_new_cat !== 0 && $check_new_cat !== null) {
            $new_cat = get_cat_ID(\'failed\');
        } else {
            return;
        }

        // post time plus two years
        $post_plus_two = strtotime(\'+2 years\') + strtotime(get_the_date(\'Y-M-d\',$post_id));

        if (strototime(date(\'Y-M-d\')) >= $post_plus_two && has_category($default_cat,$post_id)) {
            wp_remove_object_terms($post_id, $default_cat, \'category\');
            $args = array(
                \'ID\' => $post_id,
                \'post_category\' => array($new_cat),
            );
            wp_update_post($args);
        }

        // re-hook this function
        add_action(\'save_post\', \'check_if_cat_has_reached_time\');
    }
}
add_action(\'publish_post\', \'check_if_cat_has_reached_time\');
Theremove_action 部分很重要,因为wp_update_post 火灾save_post 每次调用时都钩住它,因此可以创建一个无限循环。

结束

相关推荐

Bulk update wordpress posts

编码器。我对WP编码真的很陌生,我没有任何知识,我们到了。我创建了一个插件(实际上找到了它,但我做了一些修改),更新了我所有的wp帖子。让我们向您展示代码,if ( ! class_exists( \'MyPlugin_BulkUpdatePosts\' ) ) : class MyPlugin_BulkUpdatePosts { public function __construct() { register_activa