5

ワードプレスプラグインWooCommerceを実行しているワードプレスサイトがあります。このサイトで扱っている商品の量が非常に多いため、サイト外で商品リストを管理してアップロードしています。多くの製品にはまだ画像がありませんが、画像のURLがハードコードされているため、取得時に追加できます。壊れた画像を回避するために、画像サイズを少し検索し、見つからない場合はプレースホルダーに置き換えます。

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

どんな助けでも大歓迎です。

4

1 に答える 1

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

私は非常に多くの製品を持っているので、プラグインはそれらを小さなバッチで処理します。私は一度に約2000の製品のバッチを失敗することなく管理しています。config.phpでphpのメモリ制限を調整する必要がありました

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

これを達成するためのより簡単な方法があるのではないかと思いますが、当面はこのソリューションで十分です。

于 2013-03-06T11:05:00.187 に答える