2013-03-01 3 views
5

나는 Wordpress Plugin WooCommerce를 운영하는 WordPress 사이트를 운영하고 있습니다. 이 사이트는 취급하고있는 제품의 양이 매우 크기 때문에 사이트 외부에서 제품 목록을 관리하고 업로드했습니다. 많은 제품에는 아직 이미지가 없지만 하드 코딩 된 이미지 URL이 있으므로 이미지를 가져올 때 추가 할 수 있습니다. 깨진 이미지를 얻으려면 이미지 크기를 조금만 찾으면됩니다. 찾지 못하면 자리 표시 자로 바꿉니다.제품 이미지로 제품을 표시하는 Woocommerce

$src = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), $size); 
if (@getimagesize($src[0])) { 
    //display product image 
} else { 
    //display placeholder image 
} 

이것은 대부분의 경우에 잘 작동하지만 지금은 카테고리에 제품을 표시하려고합니다. 나는 이미지가있는 모든 제품을 먼저 표시 한 다음 이미지없이 제품을 표시하려고합니다. 문제는 이미지가없는 제품을 제외하면 처음 12 개 제품을 반복하고 이미지가있는 12 개 서브 세트 만 표시하면 루프가 시작됩니다. 내가 원하는 것은 이미지가있는 12 개의 제품이있을 때까지 루핑을 계속하는 것입니다 (이미지가있는 12 개의 제품이있는 경우).

이것이 현재 작동하지 않는 기능입니다. 내가 코드에 없었습니다

<?php if (have_posts()) : ?> 
    <ul class="products"> 
     <?php while (have_posts()) : the_post(); ?> 
      <?php 
       $src = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), $size); 
       if (@getimagesize($src[0])) { 
        woocommerce_get_template_part('content', 'product'); 
       } 
      ?> 
     <?php endwhile; // end of the loop. ?> 
    </ul> 
<?php endif; ?> 

가능한 논리적 솔루션은 동안 루프에서 일부 제품을 무시하는 것 (그래서 어떤 이미지가없는 경우 다른 실행을 만들 것), 또는 어떻게 든 요구 사항의 일환으로 내 쿼리를 코딩 루프의 즉 $ 달러 args에 구덩이?

도움을 주시면 감사하겠습니다.

답변

1

나는 내 문제에 대해 실행 가능한 해결책을 찾을 수있었습니다. 페이지 매김을 엉망으로 만들지 않고 별도의 루프를 통해 제품을 나열하는 것은 불가능했습니다. 논리적 인 단계는 루프를 사용하여 이미지가 존재하는지 여부에 따라 제품을 주문하는 것이 었습니다. 이것은 Wordpress 주문이 이미지 링크가 파일을 가리키는 지 여부를 판단 할 수 없으므로 새로운 문제를 만듭니다.

그러나 woocommerce에서 제품에 대해 "메뉴 순서"를 설정할 수 있습니다. 그런 다음 "Woocommerce -> 설정 -> 카탈로그"에서 "기본 정렬"을 "기본 정렬"으로 설정하면이 메뉴 순서를 사용하여 카탈로그보기에서 제품을 주문합니다.

좋아요! 그러나 나는 여전히 17000 개의 제품을 가지고 있으며 각각에 대해 메뉴 순서를 지정해야합니다. 수 주일이 걸렸을 기본 woocommerce 도구를 사용하여이 작업을 수행 할 수있는 방법이 없었습니다. 그래서 이미지가 존재하는지 여부에 따라 각 제품의 "메뉴 순서"를 변경하는 약간의 플러그인을 작성하기로 결정했습니다. 내 플러그인이 작은 배치로 처리합니다 너무 많은 제품이 있기 때문에

/** 
* This function sets the value of the menu_order of a product to 0 if the product contains an image and 1 if it does not 
* @param {int} $offset this is the start number for the batch 
* @param {int} $batch The number of products to process in the batch 
*/ 
function setProductMenuOrder($offset, $batch) { 
    global $post; 
    $number_completed = 0; 

    //define the arguments to be used in the loop 
    $args = array('post_type' => 'product','offset' => $offset, 'numberposts' => $batch); 
    $myposts = get_posts($args); 

    foreach($myposts as $post) : setup_postdata($post); 
     $src = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID)); //getting image source 

     //define post to be updated 
     $my_post = array(); 
     $my_post['ID'] = $post->ID; 

     if (@getimagesize($src[0])) { //if image source points to actual image menu order is set to 0 
      $my_post['menu_order'] = '0'; 
      wp_update_post($my_post); //Update the post into the database 
      $number_completed+=1; 
     } else { //if it doesn't menu order is set to 1 
      $my_post['menu_order'] = '1'; 
      wp_update_post($my_post); //Update the post into the database 
      $number_completed+=1; 
     } 
    endforeach; 
    echo '<p>Number of products edited: <strong>'.$number_completed.'</strong>.</p>'; 
} 

I : 여기

는 포스트 데이터베이스에 기록하는 데 사용되는 기능입니다. 나는 한 번에 약 2000 개의 제품을 실패없이 관리하고 있습니다. 나는 이것을 달성하지만,이 솔루션은 충분 당분간 쉬운 방법이있을 수 있다면 난 아직도 궁금 config.php를

define('WP_MAX_MEMORY_LIMIT', '256M'); 

내 PHP 메모리 제한을 조정해야했다.

관련 문제