2013-03-01 11 views
5

Ich habe eine Wordpress-Website mit dem WordPress-Plugin WooCommerce. Aufgrund der Menge an Produkten, die diese Website verwaltet, verwalten wir die Produktliste außerhalb der Website und laden sie hoch. Viele der Produkte haben noch keine Bilder, aber sie haben eine fest codierte Bild-URL, so dass wir sie hinzufügen können, wenn wir sie bekommen. Um gebrochene Bilder zu umgehen, suche ich nur ein wenig nach der Bildgröße und wenn ich sie nicht finde und durch einen Platzhalter ersetzen kann.Woocommerce Produkte mit Produkt Bilder anzeigen

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

Dies funktioniert in den meisten Fällen gut, aber jetzt arbeite ich an der Anzeige der Produkte in einer Kategorie. Ich möchte zuerst alle Produkte mit Bildern anzeigen und dann die Produkte ohne Bilder anzeigen. Das Problem ist, wenn die Schleife startet, wenn ich Produkte ohne Bilder ausschließe, durchläuft sie die ersten 12 Produkte und zeigt nur eine Teilmenge der 12 Bilder an. Was ich möchte, ist das Schleifen, bis ich 12 Produkte mit Bildern habe (wenn es 12 Produkte mit Bildern gibt).

Dies ist, was ich gerade jetzt habe, die nicht funktioniert.

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

Mögliche logische Lösungen, die ich Code nicht in der Lage gewesen wären, eine Produkt, während in der Schleife zu ignorieren (so würde es eine weiteren Lauf machen, wenn kein Bild vorhanden ist) oder irgendwie meine Abfrage als Teil der Anforderung codiert der Schleife, dh pit es in den $ Argumenten?

Jede Hilfe würde sehr geschätzt werden.

Antwort

1

Ich habe es geschafft, eine praktikable Lösung für mein Problem zu finden. Es war einfach unmöglich, die Produkte durch separate Schleifen aufzulisten, ohne die Seitennummerierung zu stören. Der logische Schritt war also, die Schleife zu verwenden und die Produkte im Wesentlichen danach zu sortieren, ob das Bild existiert oder nicht. Dies erzeugt ein neues Problem, da die Wordpress-Sortierung nicht feststellen kann, ob die Image-Verknüpfung auf eine Datei verweist oder nicht.

Sie können jedoch eine "Menü Bestellung" für ein Produkt in woocommerce festlegen. Wenn Sie dann unter "Woo- commerce -> Einstellungen -> Katalog" die Option "Standardproduktsortierung" auf "Standardsortierung" setzen, wird diese Menüfolge verwendet, um die Produkte in einer Katalogsicht zu bestellen.

Großartig! Aber ich habe immer noch 17000 Produkte und ich muss für jeden eine Menü-Reihenfolge angeben. Es gab keine Möglichkeit, dies mit den nativen Woocommerce-Tools zu tun, die es Wochen gedauert hätte. Also entschied ich mich, ein kleines Plugin zu schreiben, um die "Menüreihenfolge" jedes Produkts zu ändern, abhängig davon, ob das Bild existiert oder nicht.

Hier ist die Funktion verwendet, um die Post-Datenbank zu schreiben:

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

ich, da ich so viele Produkte meiner Plugin sie in kleineren Chargen verarbeitet habe. Ich verwalte eine Charge von rund 2000 Produkten gleichzeitig, ohne zu versagen. Ich hatte auf mein PHP-Speicherlimit in

config.php anpassen
define('WP_MAX_MEMORY_LIMIT', '256M'); 

Ich frage mich immer noch, ob es vielleicht ein einfacherer Weg, dies zu erreichen sein, aber für die Zeit, diese Lösung ist ausreichend.

Verwandte Themen