web-dev-qa-db-ja.com

特定のWooCommerce製品のステータス変更に関する説明を変更する

WooCommerceでは、2行のコード行を追加して製品の説明を変更すると、製品ステータスの変更時に、送信時にWebサイトがエラーをスローします(saving)

私のコード:

add_action('transition_post_status', 'new_product_add', 10, 3);
function new_product_add($new_status, $old_status, $post) {
    if( 
        $old_status != 'publish' 
        && $new_status == 'pending' 
        && !empty($post->ID) 
        && in_array( $post->post_type, 
            array( 'product') 
        )
    ) {
        $term = get_term_by('name', 'فروش پیج اینستاگرام', 'product_cat');
        wp_set_object_terms($post->ID, $term->term_id, 'product_cat', true);

        /******************************/
        $product = wc_get_product($post->ID);
        $product->set_description("something");
        $product->save();
        /******************************/
    }
}

ご覧のように、これらの最後の3行は、ページの更新で問題が発生し、製品の説明も更新されますが、エラーが表示されます

"サイトIS技術的な困難の経験"

それらを削除すると問題なく動作し、成功したメッセージが表示されます

[〜#〜]更新[〜#〜]

Wordpress方法でこれらの3行を変更しました

wp_update_post( array('ID' => $post->ID, 'post_content' => "something"));

まだ仕事をしますが、成功したメッセージの代わりに私にこの技術的なエラーを与えます

アップデートII

Chromeコンソールを開くと、このエラーも表示されます

Failed to load resource: the server responded with a status of 500 () (index):1
1
iKamy

wp_update_post()を使用しているときに_transition_post_status_フックで無限ループが発生しないようにするには、次のことを試してください。

_add_action('transition_post_status', 'new_product_add', 10, 3);
function new_product_add($new_status, $old_status, $post) {
    if( 
        $old_status != 'publish' 
        && $new_status == 'pending' 
        && !empty($post->ID) 
        && $post->post_type === 'product'
    ) {
        $term = get_term_by('name', 'فروش پیج اینستاگرام', 'product_cat');
        wp_set_object_terms($post->ID, $term->term_id, 'product_cat', true);

        // unhook this function so it doesn't loop infinitely
        remove_action( 'transition_post_status', 'new_product_add', 10 );

        wp_update_post( array('ID' => $post->ID, 'post_content' => "something"));

        // re-hook this function
        add_action( 'transition_post_status', 'new_product_add', 10, 3 );
    }
}
_

または:

_add_action('transition_post_status', 'new_product_add', 10, 3);
function new_product_add($new_status, $old_status, $post) {
    if( 
        $old_status != 'publish' 
        && $new_status == 'pending' 
        && !empty($post->ID) 
        && $post->post_type === 'product'
    ) {
        $term = get_term_by('name', 'فروش پیج اینستاگرام', 'product_cat');
        wp_set_object_terms($post->ID, $term->term_id, 'product_cat', true);

        $product = wc_get_product($post->ID);

        // unhook this function so it doesn't loop infinitely
        remove_action( 'transition_post_status', 'new_product_add', 10 );

        $product->set_description("something");
        $product->save();

        // re-hook this function
        add_action( 'transition_post_status', 'new_product_add', 10, 3 );
    }
}
_

それはあなたの問題を解決するかもしれません。

これは ここでwp_update_post() for _save_post_フックについて文書化されています。

2
LoicTheAztec