php WP post_updated $post_after,$post_before显示相同的产品类别

vx6bjr1n  于 2023-02-07  发布在  PHP
关注(0)|答案(3)|浏览(122)

我正在尝试在更新某个产品类别的产品后自动更新xml提要...
我发现我可以用post_updated钩子来实现这一点。
提要只包含类别"Willhaben"的产品。所以每当我从产品中删除类别"Willhaben"时,我需要更新提要,以便使提要保持最新...
我的问题是,当我从我的feed中删除类别后,post_updated钩子不再触发,因为我添加了一个if,以便在没有类别"Willhaben"的产品更新时不更新feed,以避免过载。
我尝试使用$post_after、$post_before来检查产品是否曾经有过"Willhaben"类别,然后重新构建提要,但$post_after、$post_before总是为我提供完全相同的特定产品类别列表...
下面是我的代码:

function wpdocs_run_on_transition_only( $post_ID, $post_after, $post_before ) {
   if(has_term( 1467, 'product_cat', $post_before ) || has_term( 1467, 'product_cat',  $post_after)) {
      create_gebraucht_feed(true);
      return;
   }
}
add_action( 'post_updated', 'wpdocs_run_on_transition_only', 10, 3 );

因此,由于类别列表总是相同的,我无法确定产品是否具有类别"Willhaben",因此不会创建提要...
我希望大家都明白我的意思......在座的各位知道我做错了什么吗?我已经面对这个问题好几个小时了,不知道该怎么办了......
谢谢你抽出时间,我很感激你的帮助,谢谢!

ljsrvy3e

ljsrvy3e1#

是的@RomkaLTU!谢谢你为我做了很多工作,这是我最终得到的:

if ( get_post_meta($post_ID, 'is_feed', true) == 1 || has_term( 1467, 'product_cat', $post_after )) {
        create_gebraucht_feed(true);
        
        if(!has_term( 1467, 'product_cat', $post_after )) {
            update_post_meta($post_ID, 'is_feed', 0);
        }
        return;
    }
bf1o4zei

bf1o4zei2#

如果你不能确定两者的区别,可以使用以下方法:

update_post_meta($post_ID, 'is_feed', 1)

因此,如果你更新了一篇文章,而它不包含所需的类别,那么is_feed就会更新为0。
update_post_meta应该在函数的末尾。请在开头选中它。

ui7jx7zq

ui7jx7zq3#

我也有同样的问题:变量$post_before$post_after具有相同的类别,尽管我在保存时更新了类别。
我在其他地方读到过post_updated-hook运行得太晚,以至于两个变量都拥有相同的类别。我最终使用了pre_post_update-hook,如下所示:

function myFunctionBeforeUpdate($post_id, $data)  {
    //$post_id corresponds to the post BEFORE the update
    //$_POST holds all the information for the post AFTER the update
    
    $old_cats = get_the_category($post_ID);
    $new_cat_ids = ($_POST["post_category"]);
    
    $old_cat_names = array();
    $new_cat_names = array();
    
    foreach ( $old_cats as $category ) {
        $old_cat_names[] = $category->name;
    }
    
    foreach ( $new_cat_ids as $cat_id ) {
        $cat = get_category( $cat_id );
        $new_cat_names[] = $cat->name;
    }

    // you can now use the arrays $old_cat_names and $new_cat_names 
    // which contain the names (not IDs) of the old and new categories

}
add_action('pre_post_update', 'myFunctionBeforeUpdate', 10, 2 );

相关问题