在特定时间后更改自定义分类-CPT模板

时间:2021-10-11 作者:praba

I wish to change the custom taxonomy for the custom post type after a certain time similar to post expiration.
Custom taxonomy: current-status
term-id: 368
post-type: job

I have created the function wp_set_post_categories and wish to include it in the post-job template in the generatepress child theme after generate_do_template_part( \'page\' );.
Does this create any issues?

$nvs_taxonomy = \'custom-status\';
//expiration time
$expirationtime = get_post_meta($post->ID, \'expiration\', false);
if( count( $expirationtime ) != \'\' ) {
    if (is_array($expirationtime)) {
        $expirestring = implode($expirationtime);
    }

    $secondsbetween = strtotime($expirestring)-time();

    if ( $secondsbetween >= 0 ) {
        echo \'This post will expire on \' .$expirestring.\'\';
        the_content();
    } else {
        function set_new_category( $post_id ) {
            //Define new category by ID
            $new_category = array( 368 );
            $old_term = wp_get_post_terms( $post_id, $nvs_taxonomy );

            if( is_array( $old_term ) && ! empty( $old_term ) ) {
                if ( in_array( \'custom-status\', $old_term ) {
                    wp_set_post_categories( $post_id, $new_category, $append = true );
                }
            }
        }
    }
}

Following the advice of Mr. @Buttered_Toast I have modified the code little bit to use timestamp data directly. However, in that, I have noticed a "PHP Warning: A non-numeric value encountered in /single-job.php on line 34"

if ( generate_has_default_loop() ) {
   while ( have_posts() ) :
   the_post();
    $expire_timestamp = rwmb_meta( \'j_post_expire\' );// line 31      
    $current_time = time(); // line 32
    
    // Ensure the timestamp parsed correctly.
    if ( $expire_timestamp ) {
    $seconds_between = $expire_timestamp - $current_time; //line 34
    if ( $seconds_between >= 0 ) {
       generate_do_template_part( \'single\' );
    } else {
    wp_set_post_terms( $post->ID, array ( 368 ), \'current-status\', true );
    wp_remove_object_terms( $post->ID, array ( 367 ), \'current-status\' );
     generate_do_template_part( \'single\' );
     }
    } else {
    generate_do_template_part( \'single\' );
    }
    endwhile;
    }

To overcome the non-numeric error, I have initialized the variable ($seconds_between) as an integer.

$seconds_between = 0; //intialize as integer after line 32  

In other way, we can define other variables ($current_time and $expire_timestamp) with (int)

$seconds_between = (int)$expire_timestamp - (int)$current_time;//declaring variables as integer

  • If there is any better way, please share to correct it
1 个回复
最合适的回答,由SO网友:Levi Cole 整理而成

您的代码有很多问题。。。

  1. if (is_array($expirationtime)) 是多余的,因为get_post_meta 如果第三个参数为false,将始终返回数组
  2. implode($expirationtime); 需要分隔符,例如。implode(\' \', $expirationtime);.
  3. strtotime 可能无法分析您的输入,从而导致错误值。尝试执行时将出现错误false - time().function set_new_category() {} 但不使用它
  4. wp_set_post_categories 用于设置类别分类的术语。对于自定义分类,请使用wp_set_post_terms 取而代之的是
修复了以上所有问题后,您应该会得到以下结果。。。

$expiration_time = get_post_meta( $post->ID, \'expiration\', false );

if ( count( $expiration_time ) ) {

    $expire_string = implode( \' \', $expiration_time );
    $expire_timestamp = strtotime( $expire_string );

    // Ensure the timestamp parsed correctly.
    if ( $expire_timestamp ) {
        $seconds_between = $expire_timestamp - time();

        if ( $secondsbetween >= 0 ) {
            echo \'This post will expire on \' . $expire_string;
            the_content();
        } else {
            wp_set_post_terms( $post->ID, [ 368 ], \'custom-status\', true );
        }
    }

}
这不是一个完整的答案,但肯定会为你指明正确的方向。

相关推荐