Custom Post Type Category URL

时间:2019-10-01 作者:Vucko

我创建了一个名为shop 其中包含一些商店商品。之后我又加了一句category 支持it,工作正常(\'taxonomies\' => array( \'category\' )). 然后我创建了template-shop.php 在那里我保留了我所有的逻辑(我使用template 因为我通过polylang).

因此,假设当前我的URL如下所示:www.foo.com/shop

现在我想“过滤”我的类别,我目前使用URL参数进行过滤:

<?php 

  $current_url = strtok($_SERVER["REQUEST_URI"], \'?\');

  // if param category exists filter by it

  if (isset($_GET[\'category\'])) {
    $category = $_GET[\'category\'];

    $args = array (
      \'post_type\' => array( \'shop\' ),
      \'order\' => \'ASC\',
      \'posts_per_page\' => -1,
      \'category_name\' => $category
    );

  } else {

    $args = array (
      \'post_type\' => array( \'shop\' ),
      \'order\' => \'ASC\',
      \'posts_per_page\' => -1
    );

  }

  $shop = new WP_Query( $args );
?>
而且效果很好

www.foo.com/shop/?category=bar
www.foo.com/shop/?category=baz
etc.
我的问题是,我是否可以以某种方式“更新”逻辑,使URL看起来更好?我希望它是:

www.foo.com/shop/category/bar
www.foo.com/shop/category/baz
etc.
或者类似的东西。

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

选项1:启用post类型存档并使用post类型存档模板

启用存档;e、 g.使用注册帖子类型时register_post_type():

register_post_type( \'shop\', [
    \'has_archive\' => \'shop\', // the archives are accessible at example.com/shop
    // ...
] );
archive template 仅针对该职位类型;i、 e。archive-shop.php.

您可以使用add_rewrite_rule() 重写example.com/shop/category/<category slug>example.com/?category_name=<category slug>&post_type=shop:

// This should be called in `init`.
add_rewrite_rule(
    \'^shop/category/([^/]+)/?$\',
    \'index.php?category_name=$matches[1]&post_type=shop\',
    \'top\'
);
pre_get_posts 钩子来过滤主WordPress查询(因为我可以看到您正在使用一些自定义查询变量/值)。但在归档模板中,您不需要自定义WP_Query 查询(即。$shop = new WP_Query).

选项2:如果需要使用以自定义帖子类型显示帖子的自定义页面通过“自定义页面”,我指的是具有以下类型的帖子page. 此外,使用此选项的优点是,您不需要启用默认的post类型存档。

因此,首先,获取使用自定义模板的页面ID(template-shop.php).

您可以使用add_rewrite_rule() 重写example.com/shop/category/<category slug>example.com/?shop_cat=<category slug>&page_id=<page ID> &mdash;"shop_cat" can be changed 到其他非保留名称,但您还需要在步骤#3&;中更改名称#以下4项:

// This should be called in `init`.
add_rewrite_rule(
    \'^shop/category/([^/]+)/?$\',
    // Make sure to use the correct Page ID.
    \'index.php?shop_cat=$matches[1]&page_id=2\',
    \'top\'
);
query_vars 钩子以添加shop_cat 公共WordPress查询变量的变量:

add_filter( \'query_vars\', function ( $vars ) {
    $vars[] = \'shop_cat\';
    return $vars;
} );
  • 英寸template-shop.php 或者只要有必要,就打电话get_query_var( \'shop_cat\' ) 要从URL检索类别slug,请执行以下操作:

    $args = array(
        \'post_type\'      => array( \'shop\' ),
        \'order\'          => \'ASC\',
        \'posts_per_page\' => -1,
    );
    
    if ( $category = get_query_var( \'shop_cat\' ) ) {
        $args[\'category_name\'] = $category;
    }
    
    $shop = new WP_Query( $args );
    
  • 最后但并非最不重要的一点是,上述两个选项还有其他变体,但我提供的这些选项应该可以帮助您开始使用。

    相关推荐

    Prevent Archive URLs

    如果我在URL后添加一年,我的Wordpress站点就会查找存档页。例如:http:/mysiteurl.com/my-site/2018. 如果今年有帖子,它最终会重定向到index.php 出于某种原因。如果那一年没有帖子,就会转到404页,这就是我想要的。例如:http:/mysiteurl.com/my-site/2014 转到404页,因为那年没有帖子,这就是我想要的。我的永久链接结构设置为Post name 是这样的http:/mysiteurl.com/my-site/sample-post