2013-03-01 22 views
5

Tôi có một trang wordpress đang chạy plugin WooCommerce của wordpress. Do khối lượng sản phẩm tuyệt đối mà trang web này đang xử lý, chúng tôi đã quản lý danh sách sản phẩm bên ngoài trang web và tải lên. Rất nhiều sản phẩm chưa có hình ảnh nhưng chúng có một url hình ảnh được mã hóa cứng để chúng tôi có thể thêm chúng khi chúng tôi nhận được chúng. Để có được xung quanh hình ảnh bị hỏng tôi chỉ cần làm một chút tìm kiếm cho kích thước hình ảnh và nếu tôi không thể tìm thấy nó và thay thế nó bằng một giữ chỗ.Woocommerce Hiển thị Sản phẩm Với Hình ảnh Sản phẩm

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

Điều này hoạt động tốt trong hầu hết các trường hợp nhưng bây giờ tôi đang làm việc để hiển thị các sản phẩm trong danh mục. Tôi muốn hiển thị tất cả các sản phẩm có hình ảnh trước và sau đó hiển thị các sản phẩm không có hình ảnh. Vấn đề là khi vòng lặp bắt đầu nếu tôi loại trừ các sản phẩm không có hình ảnh, nó sẽ lặp qua 12 sản phẩm đầu tiên và chỉ hiển thị một tập hợp con của 12 sản phẩm có hình ảnh. Những gì tôi muốn làm là giữ vòng lặp cho đến khi tôi có 12 sản phẩm với hình ảnh (nếu có 12 sản phẩm có hình ảnh).

Đây là những gì tôi có ngay lúc này không hoạt động.

<?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; ?> 

giải pháp hợp lý có thể xảy ra mà tôi đã không thể mã sẽ bỏ qua một số sản phẩm trong khi ở các vòng lặp (vì vậy nó sẽ làm cho chạy khác nếu không có hình ảnh) hoặc bằng cách nào đó mã truy vấn của tôi như một phần của yêu cầu của vòng lặp tức là hố nó trong $ args?

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

1

Tôi đã tìm ra giải pháp khả thi cho vấn đề của mình. Nó chỉ là không thể liệt kê các sản phẩm thông qua các vòng riêng biệt mà không làm cho một mess của pagination. Vì vậy, bước hợp lý là sử dụng vòng lặp và về cơ bản đặt hàng các sản phẩm dựa trên việc hình ảnh có tồn tại hay không. Điều này tạo ra một vấn đề mới bởi vì thứ tự Wordpress không thể xác định liệu liên kết hình ảnh có trỏ tới một tệp hay không.

Tuy nhiên, bạn có thể đặt "Thứ tự menu" cho một sản phẩm trong woocommerce. Sau đó, nếu bạn đặt "Sắp xếp sản phẩm mặc định" thành "Sắp xếp mặc định" trong "Woocommerce -> Cài đặt -> Danh mục", nó sẽ sử dụng thứ tự menu này để đặt hàng các sản phẩm trong chế độ xem danh mục.

Tuyệt vời! Nhưng tôi vẫn có 17.000 sản phẩm và tôi cần phải chỉ định thứ tự Menu cho mỗi sản phẩm. Không có cách nào tôi có thể làm điều này bằng cách sử dụng các công cụ woocommerce bản địa nó đã có thể mất vài tuần. Vì vậy, tôi quyết định viết một plugin nhỏ để thay đổi "thứ tự Menu" của mỗi sản phẩm dựa trên việc hình ảnh có tồn tại hay không.

Đây là chức năng dùng để viết thư cho bài cơ sở dữ liệu:

/** 
* 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>'; 
} 

tôi kể từ khi tôi có rất nhiều sản phẩm Plugin của tôi xử lý chúng theo lô nhỏ hơn. Tôi đang quản lý một loạt khoảng 2000 sản phẩm cùng một lúc mà không bị lỗi. Tôi đã phải điều chỉnh giới hạn bộ nhớ của tôi trong php config.php

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

tôi vẫn tự hỏi, nếu có thể có một cách dễ dàng hơn của việc hoàn thành điều này, nhưng trong thời gian tới giải pháp này sẽ đủ.