찾다

 >  Q&A  >  본문

WooCommerce에 여러 제품 속성 추가

WooCommerce 사이트에 새 책을 제출하기 위한 양식이 있습니다. 저는 책의 상태를 제품 속성으로 저장하곤 했습니다. <​​/p> 으아아아

쉽습니다. 이제 책 저자 이름과 장르를 추가하려고 하는데 코드를 복사하면 마지막 제품 속성만 설정됩니다. 나는 아마도 그것을 루프에 넣어야 한다는 것을 알고 있지만, 나는 멍청하거나 내가 무엇을 놓치고 있는지 알 수 없습니다.

// Set the book's condition

$condition = $_POST['condition'];
wp_set_object_terms( $product_id, $condition, 'pa_condition', true );

$att_condition = Array('pa_condition' =>Array(
       'name'=>'pa_condition',
       'value'=>$condition,
       'is_visible' => '1',
       'is_taxonomy' => '1'
     ));

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

P粉124890778P粉124890778241일 전439

모든 응답(2)나는 대답할 것이다

  • P粉087074897

    P粉0870748972024-03-27 13:25:50

    해결책을 찾으셨다니 다행입니다. 그러나 원래 질문에 대한 답변은 제공되지 않았으며 귀하의 솔루션에는 개선되어야 할 간단한 버그가 있습니다.

    원래 질문으로 돌아갑니다.

    원본 코드에 여러 가지 문제가 있습니다.

    1. 코드의 변수 이름 지정 및 사용법에 오류가 있습니다. 두 번째로 update_post_meta를 호출하면 $att_condition 변수를 할당하지만 att-genre를 사용합니다. 3개의 변수를 사용하려면 이를 수정하세요. 그러나 코드는 여전히 작동하지 않습니다.

    2. 3개의 다른 변수($att_condition, $att_genre, $att_author)에 대해 동일한 메타 키 _product_attributes에 대해 update_post_meta를 3번(첫 번째 문제에 대한 수정 가정) 호출하고 있습니다. update_post_meta는 Meta_key 값이 발견되고 전달된 값과 다른 경우 해당 값을 덮어씁니다. 변수에 배열 값을 할당했지만 모두 고유하며 하나의 배열 레코드만 저장됩니다. 따라서 update_post_meta에 대한 마지막 호출이 이전 쓰기를 덮어쓰게 됩니다. 대신 모든 속성 배열 데이터를 단일 배열 변수에 할당한 다음 update_post_meta를 한 번 호출하려고 합니다. 그러면 추가한 모든 속성으로 올바르게 업데이트됩니다.

    이를 통해 더욱 강력하고 지원 가능한 foreach 스타일 솔루션을 얻을 수 있습니다.

    솔루션에 발생한 간단한 문제는 성능 문제입니다. 포함하셨습니다

    으아아아

    foreach 루프 내부 외부가 아닙니다. 따라서 지금은 update_post_meta를 통해 데이터베이스에 3번 쓰고 있으며 입력 배열을 반복하고 $thedata를 빌드하면서 로드가 점차 증가합니다.

    해결책: update_post_meta 호출을 foreach 뒤로 이동하여 실행당 한 번만 호출하도록 합니다.

    마지막으로 이 호출을 래핑하고 $my_product_attributes에 대한 초기 할당을 포함하거나 필요에 적합하다고 생각되는 관련 조건부 논리 처리 및 null 값 초기화와 관련하여 $value를 사용하세요.

    회신하다
    0
  • P粉327903045

    P粉3279030452024-03-27 10:23:39

    저는 https://stackoverflow.com/a/45475863/12092133에서 해결책을 찾았습니다.

    양식 변수를 배열에 넣은 다음 foreach를 실행했더니 제대로 작동했습니다.

    으아아아

    회신하다
    0
  • 취소회신하다