web-dev-qa-db-ja.com

Wordpress Woocommerce-update_post_metaを使用して製品属性を追加します

クライアントのWebサイトの製品には、私が追加した特定の属性が必要です。 製品->属性 Wordpress管理。このインポートスクリプトでは、コーディングしています。関数update_post_meta($post_id, $meta_key, $meta_value)を使用して、適切な属性と値をインポートする必要があります。

現在、私は次のような機能を持っています:

update_post_meta( $post_id, '_product_attributes', array());

しかし、属性とその値を適切に渡す方法がわかりませんか?

9
Daniel

そのため、自分で理解するのに少し時間がかかりましたが、最終的に次の関数を作成することでこれを行うことができました。

// @param int $post_id - The id of the post that you are setting the attributes for
// @param array[] $attributes - This needs to be an array containing ALL your attributes so it can insert them in one go
function wcproduct_set_attributes($post_id, $attributes) {
    $i = 0;
    // Loop through the attributes array
    foreach ($attributes as $name => $value) {
        $product_attributes[$i] = array (
            'name' => htmlspecialchars( stripslashes( $name ) ), // set attribute name
            'value' => $value, // set attribute value
            'position' => 1,
            'is_visible' => 1,
            'is_variation' => 1,
            'is_taxonomy' => 0
        );

        $i++;
    }

    // Now update the post with its new attributes
    update_post_meta($post_id, '_product_attributes', $product_attributes);
}

// Example on using this function
// The attribute parameter that you pass along must contain all attributes for your product in one go
// so that the wcproduct_set_attributes function can insert them into the correct meta field.
$my_product_attributes = array('hdd_size' => $product->hdd_size, 'ram_size' => $product->ram_size);

// After inserting post
wcproduct_set_attributes($post_id, $my_product_attributes);

// Woohay done!

WooCommerceでプログラム的に複数の属性をインポートする必要がある場合、この関数が他の人に役立つことを願っています。

15
Daniel

ダニエルの答えを試してみましたが、うまくいきませんでした。それ以来、Wordpress/Woocommerceのコードが変更された可能性があります。あるいは、その方法がよくわからなかったのかもしれませんが、どちらにしても、そのコードは私には何の役にも立ちませんでした。しかし、それをベースとして使用して多くの作業を行った後、私はこのコードスニペットを思いつき、テーマのfunctions.phpに配置しました。

function wcproduct_set_attributes($id) {

    $material = get_the_terms( $id, 'pa_material');

    $material = $material[0]->name;

    // Now update the post with its new attributes
    update_post_meta($id, '_material', $material);

}

// After inserting post
add_action( 'save_post_product', 'wcproduct_set_attributes', 10);

これにより、WooCommerceインストールで「マテリアル」として設定したものをカスタム属性として取得し、それを_materialとして正式なメタに追加できます。これにより、別のコードスニペットを使用できるようになり、WooCommerce検索機能がメタフィールドに拡張されます。つまり、WooCommerce検索フィールドでマテリアルを検索し、そのマテリアルを含むすべてのアイテムを表示できます。

これが誰かに役立つことを願っています。

6
Tizzy

@Danielsの答えは機能し、正しいか間違っているかを判断しませんが、属性の下に分類用語として値を追加する場合は、以下のようにコードを調整する必要があります(is_taxonomy = 1に設定)。それ以外の場合、Woocommerceはそれをカスタムメタフィールド(?)と見なします。それでも属性の下に値を追加します。これは文字列に対してのみ機能します。配列である値の場合、コードを適合させる必要があります。

さらに、@ Anandが提案するwp_set_object_termsも使用します。私が見つけたすべてのドキュメントがそれを使用しなければならないと信じるようになったので、私はそれを使用していました。ただし、wp_set_object_termsのみを使用すると、製品の編集画面に属性が表示されませんでした。答えと主題に関する読書の両方からの情報を使用することは解決策をもたらしました。

製品のバリエーションなどのコードを微調整する必要があります。

/*
 * Save Woocommerce custom attributes
 */

function save_wc_custom_attributes($post_id, $custom_attributes) {
    $i = 0;
    // Loop through the attributes array
    foreach ($custom_attributes as $name => $value) {
        // Relate post to a custom attribute, add term if it does not exist
        wp_set_object_terms($post_id, $value, $name, true);
        // Create product attributes array
        $product_attributes[$i] = array(
            'name' => $name, // set attribute name
            'value' => $value, // set attribute value
            'is_visible' => 1,
            'is_variation' => 0,
            'is_taxonomy' => 1
        );
        $i++;
    }
    // Now update the post with its new attributes
    update_post_meta($post_id, '_product_attributes', $product_attributes);
}

次に、関数を呼び出します。

   $custom_attributes = array('pa_name_1' => $value_1, 'pa_name_2' => $value_2, 'pa_name_3' => $value_3);
   save_wc_custom_attributes($post_id, $custom_attributes);

ダニエル&アナンドのコードを投稿していただきありがとうございます。それは私に大いに役立ちました。

1
user6819484

これが「正しい」方法かどうかはわかりません...しかし、保存後の属性として日付値を持つACFリピーターフィールドを追加する関数が必要だったので、これが私が思いついた関数でした。

add_action( 'save_post', 'ed_save_post_function', 10, 3 );

function ed_save_post_function( $post_ID, $post, $update ) {
  //print_r($post);
  if($post->post_type == 'product')
    {
     $dates = get_field('course_dates', $post->ID);
     //print_r($dates);
     if($dates)
       {
        $date_arr = array();
        $val = '';
        $i = 0;
        foreach($dates as $d)
               {
                 if($i > 0)
                   {
                    $val .= ' | '.date('d-m-Y', strtotime($d['date']));   
                   }
               else{
                    $val .= date('d-m-Y', strtotime($d['date']));
                   } 
                 $i++;  
               }
            $entry = array(
                           'course-dates' => array(
                                                   'name' => 'Course Dates',
                                                   'value' => $val,
                                                   'position' => '0',
                                                   'is_visible' => 1,
                                                   'is_variation' => 1,
                                                   'is_taxonomy' => 0
                                                  )
                          );
                update_post_meta($post->ID, '_product_attributes', $entry);
       }
    }
}

これが誰かを助けることを願っています。

0
john