Ajouter un attribut lors de l'enregistrement si le produit n'est pas défini : WooCommerce
P粉555682718
P粉555682718 2023-12-13 15:49:42
0
1
529

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粉555682718
P粉555682718

répondre à tous(1)
P粉520204081

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;
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal