1

いくつかのカテゴリを設定しましたが、に基づいて特定のカテゴリを表示したいと考えていますis_page()

内部では、ページ名をチェックして特定のカテゴリを出力するステートメントをpage.php作成しました。if..else現時点での問題は、the_title投稿全体が印刷されるだけでなく、印刷されることです。

これのどこが間違っているのですか?

<?php while ( have_posts() ) : the_post(); ?>
<?php get_template_part( 'content', 'page' ); ?>
<?php if ( is_page( 'Greywater Recycling' ) ) { ?>
<div class="col">
    <?php query_posts( 'category_name=Greywater Recycling&posts_per_page=5'); if (have_posts()) : while (have_posts()) : the_post(); ?>
     <h2><?php the_title(); ?></h2>

    <?php endwhile; endif; ?>
</div>
<?php } else if ( is_page( 'Stormwater Management' ) ) { ?>
<div class="col">
    <?php query_posts( 'category_name=Stormwater Management&posts_per_page=5'); if (have_posts()) : while (have_posts()) : the_post(); ?>
     <h2><?php the_title(); ?></h2>

    <?php endwhile; endif; ?>
</div>
<?php } else if ( is_page( 'Rainwater Harvesting' ) ) { ?>
<div class="col">
    <?php query_posts( 'category_name=Rainwater Harvesting&posts_per_page=5'); if (have_posts()) : while (have_posts()) : the_post(); ?>
     <h2><?php the_title(); ?></h2>

    <?php endwhile; endif; ?>
</div>
<?php } ?>
<?php endwhile; // end of the loop. ?>
4

2 に答える 2

1

コードに関する多くの問題。1つには、ループ内では機能しません。is_page

第二に、いじらないでくださいquery_posts:いつ WP_Query と query_posts() と get_posts() を使用する必要がありますか? . 本当に、二次ループのことは忘れてください。

コードは次のように簡略化できます。ではfunctions.php、名前でカテゴリ ID を取得する関数を 1 つ削除しています。もう1つは、IDを使用して2次ループを実行します。そして、page.phpそれらの関数への単純な呼び出しで。

ドキュメント: Class_Reference/WP_Query

page.php

各行で PHP タグを開く必要がないことに注意してください。これにより、コードが非常に読みにくくなります。
PHP と HTML を切り替える場合にのみ使用します

<?php 
get_template_part( 'content', 'page' ); 

// This page title
$the_title = get_the_title(); 

// Search for category with the same name of the page
$category = brsfl_get_category_id( $the_title );

// Category found, go to the secondary loop
if( $category ) {
    brsfl_check_print_categories( $category );
}

functions.php

サイトがダウンする可能性のある競合を避けるために、関数名には常に特徴的なプレフィックスを付けてください。

/**
 * Get the category ID based on its name
 */ 
function brsfl_get_category_id( $cat_name )
{
    $term = get_term_by( 'name', $cat_name, 'category' );

    // term found, return its ID
    if( $term ) {
        return $term->term_id;
    }

    // not found
    return false;
}

/**
 * Print a loop based on a category ID
 */     
function brsfl_check_print_categories( $cat_id )
{
    $args = array(
        'post_type' => 'post',
        'cat' => $cat_id,
        'posts_per_page' => 5
    );
    $the_query = new WP_Query( $args );

    if ( $the_query->have_posts() ) 
    { 
        while ( $the_query->have_posts() ) :
            $the_query->the_post();
            echo '<h2>' . get_the_title() . '</h2>';
        endwhile;
    } 
    else
    {
        echo 'No posts found...';
    } 
}

提案された範囲内で回答しましたが、これには次のようなより良い解決策があると思います。

  • ショートコード、関数を適応させるだけです。

  • 高度なカスタム フィールドを使用して、非常に具体的なカテゴリを選択できるメタ ボックスを表示し (ページ名とカテゴリ名に依存しないでください)、WP_Query関数のみを使用してテンプレートに出力します。

于 2013-04-13T02:01:02.180 に答える