使用自定义字段数据显示分类循环

时间:2018-10-15 作者:Howard Crane

只是学习PHP。想知道我做错了什么。

目的是:如果分类法术语(在“显示”分类法中)中的自定义字段有数据,则在自定义帖子类型(“博客”)中显示分类法术语的帖子循环。字段数据具有所需分类术语的名称。我的代码返回的是帖子类型中的所有帖子,而不是我指定的期限。我还确信我将帖子数量限制为2篇,但由于某种原因,我的情况发生了变化,它显示了无限的帖子。

<?php
$news = get_field(\'news\', $term);
if ( $news ) {
    ?>
    <h2 class="showhead">News & Upcoming Shows</h2>
    <?php
    $custom_terms = get_terms(\'show-blogs\');
    foreach ( $custom_terms as $custom_term ) {
        wp_reset_query();
        $args = array(
            \'post_type\' => \'blogs\',
            \'posts_per_page\' => 2,
            \'tax_query\' => array(
                array(
                    \'taxonomy\' => \'show-blogs\',
                    \'field\' => $news,
                    \'terms\' => $custom_term->slug,
                    \'posts_per_page\' => 2,
                ),
            ),
        );
        $loop = new WP_Query( $args );
        if ( $loop->have_posts() ) {
            while ( $loop->have_posts()) {
                $loop->the_post();
                ?>
                <table style="border:none;border: none;max-width: 50%;float: left;">
                    <tr>
                        <td rowspan="2" style="border:none;width: 113px;">
                            <?php  the_post_thumbnail(\'thumbnail\'); ?>
                        </td>
                        <td style="border:none;height: 45px;">
                            <?php the_title( sprintf( \'<h3><a href="%s" rel="bookmark">\', esc_url( get_permalink() ) ),\'</a></h3>\' ); ?>
                        </td>
                    </tr>
                    <tr>       
                        <td style="border:none"><?php the_excerpt();?></td>
                    </tr>
                </table>
                <?php
            }
        }
    }
}
为了让事情变得更简单,我可以做一件不同的事,那就是称之为“秀”这个词,因为它与我需要的“博客”这个词是一样的。

感谢您的指导。

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

所以你有很多东西是对的,也有一些是错的,所以我会逐行检查

First:

    wp_reset_query();
此函数在query_posts 打电话,你不应该使用其中任何一个。可悲的是,很多教程作者都是用这个,而不是他们打算用的,wp_reset_postdata, 因为它在内部调用该函数。

为了节省时间,这是一个结构合理的WP_Query 其自身清理如下所示:

$args = array();
$q = new WP_Query( $args );
if ( $q->have_posts() ) { // if posts were found
    while( $q->have_posts() { // for each post
        $q->the_post(); // set the current post
        the_title(); // display its title
        the_content(); // display its content
    }
    // after the loop, reset the current post back to before the loop 
    wp_reset_postdata();
} else {
    // no posts were found
}
请注意wp_reset_postdatawhile 循环,但在if 陈述这样,只有在有工作要清理时,才会重置postdata。

Second:

您的查询参数很接近,但不完全正确:

    $args = array(
        \'post_type\' => \'blogs\',
        \'posts_per_page\' => 2,
        \'tax_query\' => array(
            array(
                \'taxonomy\' => \'show-blogs\',
                \'field\' => $news,
                \'terms\' => $custom_term->slug,
                \'posts_per_page\' => 2,
            ),
        ),
    );
    $loop = new WP_Query( $args );
备注:

  • field 确定您正在搜索的内容。又名带E的术语ID 5或带有slug test, 等等,它的可能值数量有限。默认值为term_id, 所以你应该删除这个terms 是的,但是您可以通过传递术语ID(即\'terms\' => $custom_term->term_id,, 这甚至可能快一点。因此,始终首选术语ID而不是术语slug或名称,因为slug/名称可以编辑,但ID始终保持不变posts_per_page 不属于tax_query

Third:

你的代码正在按你的意愿拉2个帖子,它只是做了多次而已。它不是一个行为不正常的查询,而是多个查询执行相同的操作,但针对不同的术语。

$custom_terms = get_terms(\'show-blogs\');
foreach ( $custom_terms as $custom_term ) {
这么说吧$custom_terms 包含5 条款。这是循环的5次迭代,每个循环中查询2篇文章,因此2篇文章x 5次迭代=10篇文章。

我们可以通过修改

$custom_terms = get_terms(\'show-blogs\');
foreach ( $custom_terms as $custom_term ) {
    ?><h3>Show Blog: <?php echo esc_html( $custom_term->name ); ?></h3><?php
现在,我们应该将每个术语视为标题,然后是两篇文章。

Notable mentions:

<祝贺您使用esc_url, 逃跑是一种被低估的安全措施,它可以为保护一个网站创造奇迹。Escape late Escape经常使用一些CSS网格可以使您的表布局更简单/更易于管理} 等,并将其缩进,并坚持一种样式,例如。while () {} 而不是while(): endwhile;, 它避免了一整类的错误和bug,而且阅读和键入更加方便

结束