0

よし、これは大きくなるぞ。多くの人が知っているように、ループ内でデータベースに複数回クエリを実行しないことをお勧めしますが、このタスクではそうしないのは非常に困難です-少なくとも私にとっては。さあ行こう。

Wordpress には、投稿の 6 つのカテゴリがあります。ページは、各カテゴリの最新の 3 つの投稿を呼び出して、それらを順番に (混在させずに) 表示する必要があります。

そのタスクを完了するには、まず DB にカテゴリを問い合わせます。次に、foreachカテゴリ $wp_query オブジェクトを使用して、そのカテゴリ名の下にある最後の 3 つの投稿を取得するクエリを実行します。これにより、6 つのクエリが作成されます。カテゴリは変更される可能性があり、もちろん、コードを変更するたびに呼び出されることは望ましくありません。

$wpdb を使用して 1 回限りの MySQL (5.5) クエリを使用して、これらすべての投稿と変数を取得しようとしました。

SELECT
    DISTINCT $wpdb->posts.ID,
    $wpdb->posts.post_title,
    $wpdb->posts.post_excerpt,
    $wpdb->posts.comment_count,
    $wpdb->posts.guid,
    $wpdb->posts.post_status,
    $wpdb->posts.post_name,
    $wpdb->posts.post_date,
    $wpdb->posts.post_type,
    $wpdb->terms.slug
FROM (
      SELECT
        $wpdb->posts.ID,
        $wpdb->posts.post_title,
        $wpdb->posts.post_excerpt,
        $wpdb->posts.comment_count,
        $wpdb->posts.guid,
        $wpdb->posts.post_status,
        $wpdb->posts.post_name,
        $wpdb->posts.post_date,
        $wpdb->posts.post_type,
        $wpdb->terms.slug,
        @num := if(@group = $wpdb->terms.slug, @num + 1, 1) as row_number,
        @group := $wpdb->terms.slug
      FROM $wpdb->posts
      LEFT JOIN $wpdb->term_relationships
             ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
      LEFT JOIN $wpdb->term_taxonomy
             ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
      LEFT JOIN $wpdb->terms
             ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
      ORDER BY $wpdb->terms.slug ASC, $wpdb->posts.post_date DESC
    ) as $wpdb->posts

LEFT JOIN $wpdb->term_relationships
       ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy
       ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
LEFT JOIN $wpdb->terms
       ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)

WHERE $wpdb->posts.post_type = 'site_type'
  AND $wpdb->posts.post_status = 'publish'
  AND $wpdb->term_taxonomy.taxonomy = 'site_category'
  AND $wpdb->terms.slug IN ('cars', 'planes', 'motorcycles', '4x4', 'bicycles', 'jetpacks')
  AND row_number <= 5

ORDER BY $wpdb->terms.slug ASC, $wpdb->posts.post_date DESC
LIMIT $total    

その後、結果の配列をに応じて分割しslugます。その結果が問題です。

PHPMyAdmin では、このクエリを実行row_numberし、合計しません。すべての行が値 1 を取得します。これにより、すべての「X slug の下の投稿のグループ」に制限がなくなり、機能しなくなりrow_number <= 5ます。カスタム ページでは、最初のカテゴリ (7 件の投稿) に 3 件以上が表示されます。

4

2 に答える 2

0

MySQL変数を再試行し、失敗した後、別のオプションが表示されました。-を使用するUNION ALLと、ここSELECT各グループのN番号が示され、簡単な言葉でそれらすべてを結合します。パフォーマンスに関しては、少なくとも私の構成では、変数を使用する場合とほぼ同じように実行されます。

そこで、foreachカテゴリを作成し、そのグループのクエリを追加します。

    $p = 1;
    $numb = count($products);
    global $wpdb;
foreach($categories as $product) {
    $query .=  "(SELECT $wpdb->posts.ID, $wpdb->posts.post_title, $wpdb->posts.post_excerpt, $wpdb->posts.comment_count, $wpdb->posts.guid,
        $wpdb->posts.post_status,
        $wpdb->posts.post_name,
        $wpdb->posts.post_date,
        $wpdb->posts.post_type,
        $wpdb->terms.slug
    FROM $wpdb->posts
    LEFT JOIN $wpdb->term_relationships
        ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
    LEFT JOIN $wpdb->term_taxonomy
        ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
    LEFT JOIN $wpdb->terms
        ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
    WHERE $wpdb->posts.post_type = 'pb_review'
    AND $wpdb->posts.post_status = 'publish'
    AND $wpdb->term_taxonomy.taxonomy = 'product_reviews'
    AND $wpdb->terms.slug IN ('$product->slug')
    ORDER BY $wpdb->posts.post_date DESC
    LIMIT 3)" . ($p == $numb ? '' : ' UNION ALL ');
    $p++;
}

$ queryが作成されたら、それを変数として$wpdbとvoilàに渡します。

$productos_query = $wpdb->get_results($query, OBJECT);

変数が機能せず、+ 1が追加されたのはなぜrow_numberですか?私の推測は、私が使用していたからですLEFT JOINが、私のゲストになります。

于 2012-07-05T18:54:58.980 に答える
0

あなたの質問を理解したら、使用するように伝えますquery_posts

<?php 
    $categories=array('cat1', 'cat2', 'cat3', 'cat4', 'cat5', 'cat6');
    foreach($categories as $cat)
    {
        query_posts('category_name='.$cat.'&showposts=3&orderby=date&oredr=DESC');
        while (have_posts()) : the_post();
        ?>
            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
        <?php
        endwhile;
        wp_reset_query();
    }
?>

cat1$categories 配列の, cat2......cat6を実際のカテゴリ名に置き換えるだけです。

$categoriesこのスニペットは、以前に割り当てた配列の各カテゴリから最新の 3 つの投稿 (例としてここではタイトルのみ) を表示します。

于 2012-07-05T06:35:57.350 に答える