具有自定义分类和常规类别的固定链接

时间:2013-12-02 作者:user43420

我在Wordpress中创建了一些自定义分类(例如,作者、书籍、漫画……)。我也有一些使用内置类别系统的类别(例如新闻、评论等)。

我试图获得一个永久链接结构,如/分类库/分类/类别/帖子标题/

因此,如果你用作者分类法斯蒂芬·金(Stephen King)标记一篇常规文章,并将其放入wordpress类别,你会得到/author/Stephen King/news/post title/。如果您将其标记为Under the Dome(from books)and review,您将获得/book/Under the Dome/review/。最后,我们将为每个常规帖子使用一个分类法和一个类别。

我读了一些关于在permalink结构中添加自定义分类法的答案,但我认为它们是建立在只有一个一直使用的分类法的基础上的。但我们使用的不仅仅是一种分类法。你怎么能这么做?

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

担任2个职位:

斯蒂芬·金新闻Category: “新闻”"Author": <《斯蒂芬·金》回顾《穹顶下》Category: “评论”"Book": “在穹顶下”“书”和“作者”是自定义分类法。

如果我完全理解,您希望第一个链接是:

  • /author/stephen-king/news/news-about-stephen-king
和第二个的url:

  • /book/under-the-dome/reviews/review-for-under-the-dome聪明的规则,你可以找到它here.

    文档是here.

    下载后,放入插件文件夹并激活它。

    现在您必须注册您的规则。为此,您需要编写一个简单的插件(或向现有插件添加代码)。

    创建一个新的php文件,并在其中放入如下内容:

    <?php
    /**
     * Plugin Name: WPSE #125186 Tricky Rule
     *
     */
    
    add_action(\'plugins_loaded\', \'register_my_tricky_rule\'); 
    
    function register_my_tricky_rule() {
    if ( ! function_exists(\'register_clever_rule\') ) return;
      $args = array(
        \'id\' => \'my_custom_rule\',
        \'route\' => \'/%s/%s/%s/%s\',
        \'query\' => array(\'name\'=>\'[3]\')
      );
      register_clever_rule( $args );
    }
    
    将其保存在插件文件夹中并激活它。

    此时此刻,您想要的链接只起作用,but 它会破坏由4个“片段”组成的任何其他WordPress链接。a-parent-tax/a-child/a-granchild/something.

    为了避免这种情况,您只能在片段正确的情况下运行规则。这可以使用过滤器挂钩完成skip_clever_rule.

    在插件文件中,添加如下内容:

    add_filter(\'skip_clever_rule\', \'skip_my_tricky_rule\', 10, 3);
    
    function skip_my_tricky_rule( $skip, $rule, $pieces ) {
      if ( $rule[\'id\'] == \'my_custom_rule\' ) {
        $custom_taxes = get_taxonomies(
          array(\'public\'=> true,\'_builtin\' => false, \'object_type\'=> array(\'post\') )
        );
        if ( ! in_array( $pieces[0], $custom_taxes ) ) return true;
        // one of or both next two lines can be removed for performance reasons
        if ( ! get_terms($pieces[0], array(\'fields\'=>\'ids\', \'slug\'=>$pieces[1]))) return true;
        if ( ! get_terms(\'category\', array(\'fields\'=>\'ids\', \'slug\'=>$pieces[2]))) return true;
      }
    }
    
    由于此过滤器,只有在url的前3个部分有效时,您才能运行自定义规则:

    如果第一个是有效的自定义分类名称,例如“作者”,如果第二个是该分类的有效术语,例如“斯蒂芬·金”,如果第三个是有效的类别术语,例如“新闻”,则这3个检查将逐一进行(请参见3if 在函数中)。然而,这需要付出性能方面的代价,因此您可能可以删除最后2项检查,但通过这种方式,任何url都可以如下所示:

    /author/anything-here/anything-here/news-about-stephen-king
    
    将打开news-about-stephen-king 邮递

    为了在准确性和性能之间达成妥协,您可以删除这两项检查中的一项,而保留另一项。

    如果您将这两个代码块放入新的插件文件并保存,您的链接就会正常工作,然而,此时,您必须手动在地址栏中写入URL。。。

    下一步是过滤帖子链接创建,以您想要的方式创建url。在同一插件文件中添加以下代码:

    add_filter( \'post_link\', \'my_tricky_post_link\', 10, 2 );
    
    function my_tricky_post_link( $url, $post ) {
      if ( $post->post_type == \'post\' ) {
        $custom_taxes = get_taxonomies(
          array(\'public\'=>true, \'_builtin\'=>false, \'object_type\'=>array(\'post\'))
        );
        if ( empty($custom_taxes) ) return $url;
        $newurl = \'\';
        while( empty($newurl) && ! empty($custom_taxes) ) {
          $tax = array_shift( $custom_taxes );
          $terms = get_the_terms( $post->ID, $tax );
          if ( ! empty($terms) ) {
            $term = array_shift( $terms );
            $newurl = $term->taxonomy .\'/\' . $term->slug;
          }
        }
        if ( empty($newurl) ) return $url;
        $categories = get_the_category( $post->ID );
        if ( ! empty($categories) ) {
          $cat = array_shift( $categories );
          $newurl .= \'/\' . $cat->slug;
          $url = home_url( $newurl . \'/\' . $post->post_name );
        }
      }
      return $url;
    }
    
    仅此而已。请注意,这将与any 自定义分类法,无需更改一行代码。

    <小时>

    Full plugin code can be downloaded here.

结束

相关推荐

Subpages Permalinks Issues

我的网站看起来像:Page-1 (page.php)。。。Subpage-1 (custom-collection.php; 自定义帖子类型)。。。。。。Filtering Output-Post (custom-collection-single.php)当我使用打开过滤输出帖子时/%postname% 对于permalinks,我得到404错误页。一些代码:custom-collection.php<?php $args = array( \'post_type\' => \'weine\