分页分类术语档案,每个术语包含一个帖子

时间:2013-09-19 作者:jasonbradberry

我有一个自定义查询,它获取自定义帖子类型的所有自定义分类,并显示每个类型中最新的帖子。目前,它引入了所有分类法。有没有办法将显示的分类法数量限制为每页的固定数量并分页?

// Set post type
$post_type = \'prints\';

// Get all the taxonomies for this post type
$taxonomies = get_object_taxonomies( (object) array( \'post_type\' => $post_type ) );

foreach( $taxonomies as $taxonomy ) : 

    // Get every "category" (term) in this taxonomy to get the respective posts
    $terms = get_terms( $taxonomy );

    foreach( $terms as $term ) : 

       // Query to show first post in taxonomy
        $posts = new WP_Query( "taxonomy=$taxonomy&term=$term->slug&posts_per_page=1" );

        if( $posts->have_posts() ): while( $posts->have_posts() ) : $posts->the_post(); ?><!-- 
        --><div>
            <a href="<?php esc_url( the_permalink() ); ?>">
                <?php the_post_thumbnail (\'medium\'); ?>
                <h2><?php echo $term->name; ?></h2>
            </a>
        </div><?php
        endwhile; endif;

    endforeach;

endforeach;

2 个回复
SO网友:gmazzap

要使分页工作正常,您应该在自定义页面模板中传递分页查询变量。

然后

$tax_per_page = 2;

$post_type = \'print\';

$taxonomies = get_object_taxonomies( $post_type );

$page = get_query_var(\'paged\') > 1 ? get_query_var(\'paged\')-1 : 0;

$splitted_taxes = array_chunk($taxonomies, $tax_per_page);

$taxonomies_on_page = isset($splitted_taxes[$page]) ? $splitted_taxes[$page] : false;

if ($taxonomies_on_page) { foreach( $taxonomies_on_page as $taxonomy ) {

  $terms = get_terms( $taxonomy );

  foreach( $terms as $term ) : 

    $posts = new WP_Query( "taxonomy=$taxonomy&term=$term->slug&posts_per_page=1" );

    if( $posts->have_posts() ): while( $posts->have_posts() ) : $posts->the_post();
    ?>
    <div>
    <a href="<?php esc_url( the_permalink() ); ?>">
    <?php the_post_thumbnail(\'medium\'); ?>
    <h4><?php echo $term->name; ?></h4>
    </a>
    </div>
    <?php
    endwhile; endif;

  endforeach;

} }
Note: 代码张贴在分页上方taxonomies 不是术语,因为你在问这个问题。

SO网友:kaiser

正如聊天中所讨论的,正如@Rarst已经告诉你的,没有默认的WordPress方式可以完成

多种分类法及其所有术语的存档

事实上没有办法实现

单一分类法及其所有术语的存档

在WordPress中。只是因为WordPress不能做到这一点——没有自定义SQL查询。

但你可以做一些事情来简化你的方法。

正如您在聊天中所述,我将更详细地介绍以下内容:

本质上,我试图创建的是一个类别的归档。因此,对于每个类别(自定义分类法),我想显示其中一篇文章的特色图像,以及类别的标题。

$taxonomies = get_object_taxonomies( get_post_type_object( \'prints\' )->name, \'names\' );
注意:如果设置get_object_taxonomies()objects, 您将获得完整的对象供以后使用

get_terms() 将分类法数组作为第一个参数。因此,您可以执行以下操作来获取分配给prints CPT。

注意:如果使用上面的第二个参数并获得完整的对象,请使用wp_list_pluck() 提取分类名称

$terms = get_terms( $taxonomies, array() );
如果需要影响订单,可以使用orderby (默认值:name) 和order (默认值:ASCEnding)函数调用的第二个参数/数组中的参数或使用筛选器:

apply_filters( \'get_terms_orderby\', $orderby, $args );
正如开头所述,没有默认方法可以实现在术语查询中获得一篇文章的目标。But 您仍然可以构建自己的SQL查询。还有一个过滤器:

apply_filters( \'terms_clauses\', compact( $pieces ), $taxonomies, $args );
因此,您可以跳入、更改查询、包括posts表等。

add_action( \'terms_clauses\', \'wpse114800_get_terms_with_posts\', 20, 3 );
function wpse114800_get_terms_with_posts( $clauses, $taxonomies, $args )
{
    // Alter the $clauses

    return $clauses;
}
上述过滤器回调的结果将改变WordPress生成的查询。core中的默认值如下所示:

"SELECT $fields FROM $wpdb->terms AS t $join WHERE $where $orderby $order $limits"
TheJOIN 子句的结构如下所示:

"INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id"
你现在要做的是JOIN 这个$wpdb->term_relationship 可能有以下情况:

INNER JOIN $wpdb->term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id
借用自wp_get_object_terms() 在核心

这个WHERE 子句看起来很可能像这样:

$wpdb->prepare( "WHERE tt.taxonomy IN (%s)", "\'".implode( "\', \'", $taxonomies)."\'" )
从现在起,你应该能够JOIN 这个$wpdb->posts 上的表格ID 并为每个分类术语查询一篇文章。

我强烈建议以某种方式缓存结果,将其添加为瞬态或类似的内容,因为查询可能会变得非常慢。

结束

相关推荐

How to use/enable Pagination?

我正在创建一个快捷码,以显示WordPress中具有特定配置文件的用户列表。但我无法启用或显示分页。我的网站上有25个用户,希望每页显示5个配置文件用户,并包括分页。我为学生档案添加了一个新角色student和多个使用高级自定义字段的自定义字段。因此,我需要显示一个学生列表作为适当的字段。到目前为止,问题是我无法启用的分页。下面是我的代码示例:add_shortcode(\'list-users\', \'list_users\'); function list_users($atts)

分页分类术语档案,每个术语包含一个帖子 - 小码农CODE - 行之有效找到问题解决它

分页分类术语档案,每个术语包含一个帖子

时间:2013-09-19 作者:jasonbradberry

我有一个自定义查询,它获取自定义帖子类型的所有自定义分类,并显示每个类型中最新的帖子。目前,它引入了所有分类法。有没有办法将显示的分类法数量限制为每页的固定数量并分页?

// Set post type
$post_type = \'prints\';

// Get all the taxonomies for this post type
$taxonomies = get_object_taxonomies( (object) array( \'post_type\' => $post_type ) );

foreach( $taxonomies as $taxonomy ) : 

    // Get every "category" (term) in this taxonomy to get the respective posts
    $terms = get_terms( $taxonomy );

    foreach( $terms as $term ) : 

       // Query to show first post in taxonomy
        $posts = new WP_Query( "taxonomy=$taxonomy&term=$term->slug&posts_per_page=1" );

        if( $posts->have_posts() ): while( $posts->have_posts() ) : $posts->the_post(); ?><!-- 
        --><div>
            <a href="<?php esc_url( the_permalink() ); ?>">
                <?php the_post_thumbnail (\'medium\'); ?>
                <h2><?php echo $term->name; ?></h2>
            </a>
        </div><?php
        endwhile; endif;

    endforeach;

endforeach;

2 个回复
SO网友:gmazzap

要使分页工作正常,您应该在自定义页面模板中传递分页查询变量。

然后

$tax_per_page = 2;

$post_type = \'print\';

$taxonomies = get_object_taxonomies( $post_type );

$page = get_query_var(\'paged\') > 1 ? get_query_var(\'paged\')-1 : 0;

$splitted_taxes = array_chunk($taxonomies, $tax_per_page);

$taxonomies_on_page = isset($splitted_taxes[$page]) ? $splitted_taxes[$page] : false;

if ($taxonomies_on_page) { foreach( $taxonomies_on_page as $taxonomy ) {

  $terms = get_terms( $taxonomy );

  foreach( $terms as $term ) : 

    $posts = new WP_Query( "taxonomy=$taxonomy&term=$term->slug&posts_per_page=1" );

    if( $posts->have_posts() ): while( $posts->have_posts() ) : $posts->the_post();
    ?>
    <div>
    <a href="<?php esc_url( the_permalink() ); ?>">
    <?php the_post_thumbnail(\'medium\'); ?>
    <h4><?php echo $term->name; ?></h4>
    </a>
    </div>
    <?php
    endwhile; endif;

  endforeach;

} }
Note: 代码张贴在分页上方taxonomies 不是术语,因为你在问这个问题。

SO网友:kaiser

正如聊天中所讨论的,正如@Rarst已经告诉你的,没有默认的WordPress方式可以完成

多种分类法及其所有术语的存档

事实上没有办法实现

单一分类法及其所有术语的存档

在WordPress中。只是因为WordPress不能做到这一点——没有自定义SQL查询。

但你可以做一些事情来简化你的方法。

正如您在聊天中所述,我将更详细地介绍以下内容:

本质上,我试图创建的是一个类别的归档。因此,对于每个类别(自定义分类法),我想显示其中一篇文章的特色图像,以及类别的标题。

$taxonomies = get_object_taxonomies( get_post_type_object( \'prints\' )->name, \'names\' );
注意:如果设置get_object_taxonomies()objects, 您将获得完整的对象供以后使用

get_terms() 将分类法数组作为第一个参数。因此,您可以执行以下操作来获取分配给prints CPT。

注意:如果使用上面的第二个参数并获得完整的对象,请使用wp_list_pluck() 提取分类名称

$terms = get_terms( $taxonomies, array() );
如果需要影响订单,可以使用orderby (默认值:name) 和order (默认值:ASCEnding)函数调用的第二个参数/数组中的参数或使用筛选器:

apply_filters( \'get_terms_orderby\', $orderby, $args );
正如开头所述,没有默认方法可以实现在术语查询中获得一篇文章的目标。But 您仍然可以构建自己的SQL查询。还有一个过滤器:

apply_filters( \'terms_clauses\', compact( $pieces ), $taxonomies, $args );
因此,您可以跳入、更改查询、包括posts表等。

add_action( \'terms_clauses\', \'wpse114800_get_terms_with_posts\', 20, 3 );
function wpse114800_get_terms_with_posts( $clauses, $taxonomies, $args )
{
    // Alter the $clauses

    return $clauses;
}
上述过滤器回调的结果将改变WordPress生成的查询。core中的默认值如下所示:

"SELECT $fields FROM $wpdb->terms AS t $join WHERE $where $orderby $order $limits"
TheJOIN 子句的结构如下所示:

"INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id"
你现在要做的是JOIN 这个$wpdb->term_relationship 可能有以下情况:

INNER JOIN $wpdb->term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id
借用自wp_get_object_terms() 在核心

这个WHERE 子句看起来很可能像这样:

$wpdb->prepare( "WHERE tt.taxonomy IN (%s)", "\'".implode( "\', \'", $taxonomies)."\'" )
从现在起,你应该能够JOIN 这个$wpdb->posts 上的表格ID 并为每个分类术语查询一篇文章。

我强烈建议以某种方式缓存结果,将其添加为瞬态或类似的内容,因为查询可能会变得非常慢。

相关推荐

在Get_the_Posts_Pagination函数中编辑分页文本

我想在链接模板中编辑screen\\u reader\\u文本。php我可以在一个主题中这样做,这样它就不会在更新时被覆盖。看起来过滤器是最好的选择,但我找不到关于使用什么过滤器的文档。这是我想从链接模板更改的代码。php: if ( $GLOBALS[\'wp_query\']->max_num_pages > 1 ) { $args = wp_parse_args( $args, array( \'mid_size\' =&