2013-03-01 30 views
5

私は、Wordpress Plugin WooCommerceを実行しているワードプレスサイトを持っています。このサイトは膨大な量の製品のため、サイト外の製品リストを管理してアップロードしています。多くの製品にはまだ画像がありませんが、ハードコードされた画像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; ?> 

可能性のある論理的な解決策は、whileループでいくつかの製品を無視するだろう(それは画像がない場合は別の実行になるだろう)、または何らかの形で必要条件の一部として、私のクエリをコーディングつまり、$ argsにピットインしますか?

ご協力いただければ幸いです。

答えて

1

私は私の問題に対して実行可能な解決法を見つけることができました。ページネーションを混乱させることなく、別々のループで製品をリストすることは、まったく不可能でした。したがって論理的なステップは、ループを使用し、画像が存在するかどうかに基づいて製品を本質的に注文することでした。これは、Wordpressの注文が画像リンクがファイルを指しているかどうかを判断できないため、新たな問題を引き起こします。

ただし、ウーコommerceで商品の「メニュー注文」を設定することはできます。次に、 "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>'; 
} 

私は非常に多くの製品を持っているので、私のプラグインが小さいバッチで処理します。私は一度に失敗することなく約2000製品のバッチを管理しています。私はこれを実現するのが、このソリューションは十分でしょう当分の間、もっと簡単な方法があるかもしれない場合、私はまだ疑問に思うのconfig.php

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

で私のPHPのメモリ制限を調整しなければなりませんでした。

関連する問題