Maison  >  Questions et réponses  >  le corps du texte

Ajouter un attribut lors de l'enregistrement si le produit n'est pas défini : WooCommerce

Lors de la sauvegarde d'un produit, je souhaite vérifier si le produit possède un attribut spécifique. En ce qui me concerne, pa_region. Sinon, je souhaite ajouter des ensembles d'attributs et des termes d'attribut au produit. Si la propriété pa_region est déjà définie, je ne souhaite pas la mettre à jour/la modifier.

Je vois qu'il existe une méthode appelée wp_set_object_terms 的函数(文档)。我尝试了一些方法,但我认为 update_post_meta qui est la bonne méthode.

À partir de cette réponse, je sais comment vérifier si un produit a un attribut. J'ajouterai ce chèque plus tard.

Actuellement, j'essaie d'ajouter l'attribut en premier. Ne fonctionne pas encore correctement.

J'ai trouvé une question similaire ici et j'ai essayé d'utiliser ce code pour atteindre mon objectif. Mais cela ne fonctionne pas. Je suppose que la raison est que la fonctionnalité nécessite des propriétés qui sont déjà dans le produit ? ! Edit : J'ai vérifié. Même si l'attribut pa_region est défini dans le produit, le code ne met pas à jour sa valeur.

Voici mon code actuel :

add_action('woocommerce_update_product', 'save_product_region');
function save_product_region( $post )
{
    if( in_array( $post->post_type, array( 'product' ) ) ){

        $test = 'test';
        $product_id = $post->ID;

        $product_attributes = get_post_meta( $product_id ,'_product_attributes', true);
        var_dump($product_attributes);

        // Loop through product attributes
        foreach( $product_attributes as $attribute => $attribute_data ) {
            // Target specif attribute  by its name
            if( 'pa_region' === $attribute_data['name'] ) {
                // Set the new value in the array
                $product_attributes[$attribute]['value'] = $test;
                break; // stop the loop
            }
        }

        update_post_meta( $product_id ,'_product_attributes', $product_attributes );

    }
}

P粉555682718P粉555682718285 Il y a quelques jours450

répondre à tous(1)je répondrai

  • P粉520204081

    P粉5202040812023-12-14 10:05:21

    Le premier $post n'est pas un objet. renverra l'ID, ce qui est bien.

    add_action('woocommerce_update_product', 'save_product_region');
    function save_product_region( $product_id ) {
    
        //Get product object from the ID
        $_product = wc_get_product($product_id);
        $attributes = $_product->get_attributes();
    
        $add_option = wp_set_object_terms( $product_id, 'canada', 'pa_region', true );
        $curr_options = $attributes['pa_region']['options'];
        
        //Check if we have this attribute set already 
        if(!in_array($add_option,$curr_options)):
            $updated_options = array_push($curr_options,$add_option);
            $data = array(
                'pa_region' => array(
                    'name'=>'pa_region',
                    'options'=> $updated_options,
                    'is_visible' => '1',
                    'is_variation' => '0',
                    'is_taxonomy' => '1'
                )
            );
            //First getting the Post Meta
            $_product_attributes = get_post_meta($product_id, '_product_attributes', TRUE);
            //Updating the Post Meta
            update_post_meta($product_id, '_product_attributes', array_merge($_product_attributes, $data));
        endif;
    }

    répondre
    0
  • Annulerrépondre