如何获得跨不同自定义帖子类型的术语链接?

时间:2015-06-25 作者:Caio Mars

在我的WordPress项目中,我有几个不同的custom post types 他们都有一个common 分类学我正处于项目的最后阶段,现在是时候使用边栏小部件链接所有自定义帖子类型了。我遇到的问题是,我不知道如何获得term link 链接到正确的自定义帖子类型。

例如,我有自定义的帖子类型:book、author、product;分类法:包括恐怖类的体裁。

我希望能够获得这样的链接结构:

/book/genre/horror
/product/genre/horror
/author/genre/horror
当我这样做的时候get_term_link(\'horror\');, 我得到一个术语链接,似乎其中一个自定义帖子类型有偏好。如何使每个术语链接对应于正确的自定义帖子类型?

硬编码这从来都不是一个好主意,所以我想知道是否有一个合适的方法来实现这一点。这是我面临的一个老问题,我已经做了很多寻找解决方案的工作,但我没有找到它。我来这里是万不得已的。谢谢

2 个回复
SO网友:Kd dev

此代码显示所有类别的所有帖子genre taxonomy 对于custom post type book. 现在,对于不同的custom post type (author, product ) you have to change Custom Post Type Name inside $arg of WP_Query(). 您可以使用get\\u term\\u link($catterm)函数获取术语链接,也可以使用get_the_term_list().

 $args = array(
            \'number\'     => $number,
            \'hide_empty\' => $hide_empty,
            \'include\'    => $ids
        );

        $custom_categories = get_terms( \'genre \', $args );

        foreach ( $custom_categories as $catterm){

            $arg = Array( 
            \'post_type\' => \'book\',
            \'posts_per_page\' => \'-1\',
            \'post_status\' => \'publish\',
            \'tax_query\' => Array( Array ( 
            \'taxonomy\' => \'genre \' ,
            \'terms\' => $catterm->term_id
            )) );

        $loop = new WP_Query( $arg ); 
        global $post;
        while ( $loop->have_posts() ) : $loop->the_post();
        ?>

        <div class="gallery-content">
        <div class="entry-content">

        <?php 
         echo \'<li>\' . get_the_title() . \'</li>\';
         echo \'<li><a href="\'.get_term_link($catterm).\'">\'.$catterm->name.\'</a></li>\';   
        ?>  

        </div>
        </div>

       <?php endwhile;
        }   
        ?>

SO网友:Caio Mars

好消息是,我想出了一个方法来实现这一点。这是我的解决方案。

以我上面的例子,我将向您介绍我为获得example.com/book/genre/horror 指向自定义帖子类型book, 分类学genre 和类别horror.

应该启用Pretty permalinks。转到设置>永久链接以启用它。否则,这样做就没有意义了。所以我们开始。。。

1) 创建一个名为book(和slug book)的页面,注意发布后为该页面生成的页面ID,您将需要它(您可以在URL中看到它,应该是?post= 其中包含页面ID。)

2) 现在我们需要创建一个重写,以便将链接指向正确的模板页面。所以,在你的functions.php 文件(或插件文件,由您决定)您需要添加以下代码:

function my_rewrite_rules() {

    add_rewrite_rule(
        \'book/genre/([[A-Za-z0-9\\-]+)?/?$\',
        \'index.php?page_id=1234&genre=$matches[1]\',
        \'top\'
    );

    flush_rewrite_rules();
}
add_action( \'init\', \'my_rewrite_rules\' );
现在,用为页面生成的页面ID替换1234book. 然后转到任何前端页面并重新加载。

Important: 你不想跑flush_rewrite_rules(); 每次在站点中加载页面时。这是一个繁重的功能,会让你的速度变慢。您只需在front end. 在前端重新加载任何页面后,将刷新重写规则,您可以删除此行。

此函数的作用是,如果url的结构为/book/genre/ANYTHING_HERE/, WordPress将用户重定向到ID为1234的页面,其中包含数据genre=ANYTHING_HERE. 请注意,这里的ANYTHING\\u都是通过提供的正则表达式过滤的,它只接受来自a-z、数字0-9和破折号(-)的字符(大写和小写)。

3) 转到主题文件夹并创建一个名为page-1234.php (将1234替换为your 当然是页面ID。)现在在这个文件中,你可以做各种有趣的事情。下面是如何列出所有书籍的by genre:

<?php
get_header(); 

global $wp_query;
$genre = $wp_query->query_vars[\'genre\'];

$args = array(
    \'post_type\' => \'book\',
    \'tax_query\' => array(
        array(
            \'taxonomy\' => \'genre\',
            \'field\'    => \'slug\',
            \'terms\'    => $genre,
        ), ),
);

$books = new WP_Query( $args );
?>

<h1>Books of <?php echo $genre;?></h1>
<ul>
<?php foreach ( $books as $book ) : ?>
    <li><?php echo $book->post_title; ?></li>
<?php endforeach; ?>
</ul>

<?php get_footer(); ?>
此外,如果您不使用分类法,如genre 在本例中,可以使用自定义标记。顺便说一下genre 仅在本例中有效,因为它已注册为分类法。如果不是这样,您可以通过将此添加到functions.php 因此:

function custom_rewrite_tag() {
  add_rewrite_tag(\'%food%\', \'([^&]+)\');
}
add_action(\'init\', \'custom_rewrite_tag\', 10, 0);
现在您替换genre 在步骤2中,使用标签food. 在您的page-1234.php 你可以得到query_vars[\'food\'] 并以您喜欢的方式对其进行操作,并运行如下请求example.com/book/food/chocolate. 请注意,一些query\\u vars是保留的。请查看下面的资源。

最后,要获得指向正确自定义帖子类型和分类的链接,您需要一个自定义函数。这是我唯一能想到的方法,是这样的:

function get_books_category_link( $category_slug ) {

    $page = get_permalink( 1234 );
    $link = \'\';

    if ( \'/%postname%/\' == get_option(\'permalink_structure\') ) {
        $link = $page . \'genre/\' . $category_slug;
    } else {
        $link = add_query_arg( array( \'genre\' => $category_slug ) , $page );
    }

    return $link;
}
就这样!希望有帮助。下面的一些精彩阅读,特别是StephenHarris的文章,在理解重写API方面确实有所不同。谢谢

Tuts+ The Rewrite API: The Basics

Rewrite API/add rewrite rule

WordPress Query Vars

结束

相关推荐

Get_Terms();登录时显示私人帖子

嗨,有一个自定义的帖子类型“FAQ”。我有一些私人的“常见问题解答”,也只有登录用户才能看到。我为一个小部件使用了“get\\u terms()”功能,该小部件列出了指向这些“常见问题解答”类别的链接。“get\\u术语”没有列出只有私人“FAQ”的术语。$taxonomy = \'faq_kategorien\'; $tax_terms = get_terms($taxonomy); foreach ($tax_terms as $tax_term) { echo \'