在自定义帖子类型中按类别调用第一个帖子和最后一个帖子

时间:2015-02-22 作者:Hoa

我有自定义的漫画帖子类型,称为“漫画”,并编写了一个基本的漫画导航。第一个-上一个-(当前)标题-下一个-和最后一个漫画。

在函数中。php,此代码调用第一篇和最后一篇帖子:

/**
* Get the first and latest post link for custom post type
*/

function first_comic_link( $query ) {

// Query the database for the oldest post
$first_comic = new WP_Query( array(
\'post_type\' => \'comic\',  
\'post_per_page\' =>1,
\'order\'   => \'ASC\',
)
);

if ($first_comic->have_posts()) { 

    $first_comic->the_post(); 
    $first_url=get_permalink();
    echo $first_url; 
}      

  // Prevent the loop in this function from interfering with other loops.
wp_reset_postdata();
}
/*
for latest post link
*/
function latest_comic_link( $query ) {

// Query the database for the most recent post
$last_comic = new WP_Query( array(
\'post_type\' => \'comic\', 
\'showposts\'=>1
)    
);
if ($last_comic->have_posts()) {

    $last_comic->the_post(); 
    $latest_url=get_permalink();
    echo $latest_url;
}

// Prevent the loop in this function from interfering with other loops.
wp_reset_postdata();

}
上述代码也可以存在于template\\u标记中。php。将“first”、“last”与“next”和“previous”函数分组可能更符合逻辑。

在single\\u漫画中。php,用于特定导航的代码:

<?php if (( \'comic\' ) ) : //navigation links for comics ?>

        <nav class="navigation-comic">
    <nav class="nav-first"><a href="<?php first_comic_link() ?>" title="First Episode">|&lt; First</a></nav>
    <nav class="nav-previous"><?php previous_post_link( \'%link\', \'← Previous\', TRUE ); ?></nav>
    <nav class="nav-title"><?php the_title( \'<h3 class="comic-title"><a href="\' . esc_url( get_permalink() ) . \'" rel="bookmark">\', \'</a></h3>\' ); ?></nav>
    <nav class="nav-next"><?php next_post_link( \'%link\', \'Next →\', TRUE ); ?></nav>
    <nav class="nav-last"><a href="<?php latest_comic_link() ?>" title="Latest Episode">Latest &gt;|</a></nav>
        </nav>
            <?php wp_reset_query(); ?>
结果将得到第一个和最后一个漫画帖子。在localhost上测试,WP\\u DEBUG设置为“true”,没有错误。

现在,我想对其进行改进,以处理通过每个特定类别循环的不同故事。它是如何与先前的&;一起工作的;接下来的功能。单击“上一步”或“下一步”将显示相邻的帖子,并保持在同一类别中。因此,给定类别中的每个喜剧故事都会从头到尾显示,而不会干扰其他类别。

我正在寻找一个优雅的解决方案来做到这一点,在尝试了几种方法,并通过抄本看了没有用。如果您能为我的当前代码提供正确的方向和任何改进,我将不胜感激,谢谢。

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

有些内置函数没有适当的过滤器来修改其输出,这有时令人恼火。get_boundary_post() 是内置功能之一。不幸的是,它没有根据帖子类型获取帖子,只有分类法。但是,您仍然可以使用此函数获取第一篇和最后一篇文章。它确实支持$in_same_term 参数,与next_post_link()previous_post_link() 功能。

这里只是一个注释,抄本页get_boundary_post() 不正确,有4个参数,如下(检查the source, 目前生产线1694-1750英寸wp-includes/link-template.php

get_boundary_post( $in_same_term = false, $excluded_terms = \'\', $start = true, $taxonomy = \'category\' )
如果需要对该函数进行更多控制,只需将完整函数复制到函数即可。php,重命名它并进行所需的修改

使用get_boundary_post() 如下所示,从名为mytax

//First post
$first = get_boundary_post( true, \'\', true, \'mytax\' );
echo apply_filters( \'the_title\', $first[0]->post_title );
//Last post
$last = get_boundary_post(true, \'\', false, \'mytax\');
echo apply_filters( \'the_title\', $last[0]->post_title );
只要一个音符,如果你设置$in_same_term 参数为true时,如果分类法不是默认分类法,则还需要设置分类法category 例如,分类法

previous_post_link( \'%link\', \'Previous post in same term\', TRUE, \' \', \'mytax\' );
编辑我想你得到同样帖子的原因很可能是get_boundary_post 使用get_posts 其中使用WP_Query 默认为post类型post. 正如我所说,这里没有过滤器。

最好是复制函数,重命名它,并根据需要进行修改。

试试这样的

function get_my_custom_boundary_post( $in_same_term = false, $excluded_terms = \'\', $start = true, $taxonomy = \'category\' ) {
    $post = get_post();
    if ( ! $post || ! is_single() || is_attachment() || ! taxonomy_exists( $taxonomy ) )
        return null;

    $query_args = array(
        \'post_type\' => \'MYPOSTTYPE\',
        \'posts_per_page\' => 1,
        \'order\' => $start ? \'ASC\' : \'DESC\',
        \'update_post_term_cache\' => false,
        \'update_post_meta_cache\' => false
    );

    $term_array = array();

    if ( ! is_array( $excluded_terms ) ) {
        if ( ! empty( $excluded_terms ) )
            $excluded_terms = explode( \',\', $excluded_terms );
        else
            $excluded_terms = array();
    }

    if ( $in_same_term || ! empty( $excluded_terms ) ) {
        if ( $in_same_term )
            $term_array = wp_get_object_terms( $post->ID, $taxonomy, array( \'fields\' => \'ids\' ) );

        if ( ! empty( $excluded_terms ) ) {
            $excluded_terms = array_map( \'intval\', $excluded_terms );
            $excluded_terms = array_diff( $excluded_terms, $term_array );

            $inverse_terms = array();
            foreach ( $excluded_terms as $excluded_term )
                $inverse_terms[] = $excluded_term * -1;
            $excluded_terms = $inverse_terms;
        }

        $query_args[ \'tax_query\' ] = array( array(
            \'taxonomy\' => $taxonomy,
            \'terms\' => array_merge( $term_array, $excluded_terms )
        ) );
    }

    return get_posts( $query_args );
}
那就换衣服吧MYPOSTTYPE 并将之前给定的代码更改为

//First post
$first = get_my_custom_boundary_post( true, \'\', true, \'mytax\' );
echo apply_filters( \'the_title\', $first[0]->post_title );
//Last post
$last = get_my_custom_boundary_post(true, \'\', false, \'mytax\');
echo apply_filters( \'the_title\', $last[0]->post_title );

结束

相关推荐

Global functions on WPMU

我在一个多站点环境中工作,所有站点都是相关的。最近的许多发展都要求我将某些功能复制并粘贴到许多不同的主题文件夹中,如果我需要到处更新它们,就会出现问题。拥有全局“functions.php”文件的最佳方式是什么?我的想法是要么在themes文件夹中包含一个文件并包含它,要么创建一个插件并启用该插件。