当前位置: 首页 > 知识库问答 >
问题:

Wordpress–在permalink中混合自定义帖子类型和自定义分类术语(例如www.mysite.com/cpt name/taxonomy term)

程赞
2023-03-14

在Wordpress中,我有三种自定义的帖子类型:展览、书籍、电影。我有一个分类法和两个分类法术语(store-1和store-2),可以应用于所有CPT。

我需要实现的是有一个permalink www.mysite页面。com/exhibitions,其中列出了同时标记了store-1和store-2的帖子,这可以通过CPT轻松完成。然而,我也希望有永久链接,如www.mysite。com/experiments/store-1,其中列出了exhibitions CPT中具有store-1分类法的所有帖子(依此类推,适用于每个CPT和每个分类法术语)。然而,这在permalink中创建了CPT和分类术语的混合,我不知道如何做到这一点。

我的猜测是颠倒逻辑,创建三个自定义分类,分别命名为展览、书籍和电影(当然,我需要将CPT slug更改为CPT展览、CPT书籍和CPT电影),并为每个分类创建术语store-1和store-2。通过这种方式,我将获得永久链接,如www.mysite。com/experiments/store-1。关于永久链接,如www.mysite。com/experiments,我正在考虑创建一个带有slug“experiment”的页面,并为该页面创建一个自定义模板。在模板的php中,我将添加一个循环来获取所有cpt文章,无论分类术语如何。

这不是一个真正干净的解决方案,因为我在后端基本上有三个空页面,仅用于永久链接目的。所以我想知道:是否有一个特定的函数或重写规则来实现我对名为展览、书籍、电影的CPT的需求,并且只对所有CPT应用一个自定义分类法(例如商店)?

谢谢你的见解!

共有1个答案

戚育
2023-03-14

我曾经有过这样的设置,并用一些重写规则解决了它。看看这段代码,它确实提供了您需要的永久链接,但可能需要在您的终端进行一些测试。是的,不要害怕在WordPress中重写规则。虽然有些东西可能要付出代价(例如性能问题),但实际上它们没有什么是你不能做的

add_filter('init', 'create_movies_taxonomies');
add_filter('init', 'create_movies_cpt');
add_action('init', 'movies_rewrite_rules');
add_filter('post_type_link', 'movies_post_permalinks', 10, 2);

/**
 * First create Stores taxonomy
 */
function create_movies_taxonomies() {

  register_taxonomy('stores', ['movies'],
    [
      'label'             => __('Stores', 'textdomain'),
      'public'            => true,
      'show_in_nav_menus' => false,
      'show_ui'           => true,
      'show_in_menu'      => true,
      'show_tagcloud'     => false,
      'show_in_rest'      => true,
      'hierarchical'      => false,
      'rewrite'           => ['slug' => 'store', 'hierarchical' => false, 'with_front' => false],
      'show_admin_column' => true,
      'query_var'         => true
    ]
  );
}

/**
 * Then create Movies CPT with support for Stores and proper rewrites
 */
function create_movies_cpt() {

  register_post_type('movies',
    [
      'label'             => __('Movies', 'textdomain'),
      'public'              => true,
      'publicly_queryable'  => true,
      'show_ui'             => true,
      'show_in_menu'        => true,
      'exclude_from_search' => false,
      'capability_type'     => 'post',
      'map_meta_cap'        => true,
      'show_in_rest'        => true,
      'hierarchical'        => false,
      'rewrite'             => [
        'slug'       => '/movies/%stores%',
        'with_front' => false,
        'feeds'      => false
      ],
      'query_var'           => true,
      'supports'            => ['title', 'tags', 'editor', 'comments', 'custom-fields', 'thumbnail'],
      'has_archive'         => 'movies',
      'taxonomies'          => ['stores'],
      'show_in_nav_menus'   => true,
      'menu_icon'           => 'dashicons-welcome-learn-more',
    ]
  );
}

/**
 * Add some rewrite rules for our archives (CPT, taxonomy archive)
 */
function movies_rewrite_rules() {

  add_rewrite_rule(
    'movies/([a-z]+)/page/?([0-9]{1,})/?$',
    'index.php?post_type=movies&stores=$matches[1]&paged=$matches[2]',
    'top'
  );

  add_rewrite_rule(
    'movies/([a-z]+)/([a-z0-9_-]+)/?$',
    'index.php?post_type=movies&stores=$matches[1]&movies=$matches[2]',
    'top'
  );

  add_filter('query_vars', function($vars) {
    $vars[] .= 'stores';
    $vars[] .= 'stores-page';

    return $vars;
  });

}


/**
 * Creates beautiful CPT permalinks, like site.com/movies/%term%/%post%/
 *
 * @param $permalink
 * @param $post
 *
 * @return string|string[]
 */
function movies_post_permalinks($permalink, $post) {
  // if it's not our CPT, return regular permalinks
  if (strpos($permalink, '%stores%') === false) {
    return $permalink;
  }

  // Get post taxonomy term
  $terms = get_the_terms($post, 'stores');
  // if a post has a term (store), push it into URL
  if ( ! is_wp_error($terms) && ! empty($terms) && is_object($terms[0])) {
    $term_slug = array_pop($terms)->slug;
  } // if it doesn't, push something there, let it be d
  else {
    $term_slug = 'd';
  }

  return str_replace('%stores%', $term_slug, $permalink);
}
 类似资料:
  • 本文向大家介绍WordPress 注册自定义帖子类型,包括了WordPress 注册自定义帖子类型的使用技巧和注意事项,需要的朋友参考一下 示例 假设您有一个图书馆网站,并且想要一个名为Books的自定义帖子类型。可以注册为 如此简单,您现在就注册了一个自定义帖子类型。 该代码段可以放在主题functions.php文件中,也可以放在插件结构中。

  • 本文向大家介绍WordPress 3.0中的自定义帖子类型,包括了WordPress 3.0中的自定义帖子类型的使用技巧和注意事项,需要的朋友参考一下 本文与WordPress 3.0相关。此处发布的许多代码在以前的版本中将不起作用,并且某些信息可能会在较新的版本中更改。 WordPress已经在系统中内置了五种不同的内容类型。 帖子 这是标准的内容类型,通常是博客安装中使用最多的内容。帖子往往会

  • 我有一个自定义的帖子类型设置,有许多类别和子类别。 我试图做的是创建一个页面,显示特定类别中的所有帖子,并使用一个菜单列出所有类别子类别,以便可以过滤帖子。 我已尝试复制存档模板并将其重命名为分类法-(我的自定义分类法)。php,如果我转到slug,它会显示某些帖子,并使用

  • 我试图为自定义帖子类型创建一个页面,但我无法真正实现。以下是我正在尝试的全部内容- 自定义帖子类型注册的functions.php片段 我使用名为单Tutorial.php的模板为这个自定义帖子类型模板。此外,在我的帖子显示中,我使用the_permalink()链接到帖子。 现在考虑一个标题为Test3的帖子现在在我的仪表板上,我看到它的PyMalink AS。 当我回显我得到的_permali

  • 我有一个干净的WordPress安装使用二十一,没有插件或其他修改。该博客包含大约800篇带有相关标签和类别的帖子。 我想将所有这些帖子移动到自定义帖子类型。通过将下面的代码添加到我的functions.php中,我的博客现在已经安装了自定义帖子类型,并且运行良好。 现在,我需要做的就是将常规帖子类型更改为我的自定义帖子类型。我已经设法使用插件转换帖子类型移动帖子,但我的分类没有转换。 我意识到我

  • 我有两个不同类别的自定义帖子类型(公文包),然后我有两个页面显示两个类别的帖子。 我调用页面时的url类似于mysite.com/pagename,其中pagename与公文包类别同名。 我的问题是,当我进入单一公文包时,url会变成mysite.com/portfolio/portfolio-name 有没有办法在url中显示投资组合类别?应该像mysite.com/portfolio-cate

  • 我是WordPress的新手,我正在尝试将纯HTML主题转换为WordPress主题。但我有一个问题,我找不到解决办法。在nav菜单中,我找不到有选择地向WordPress作为菜单生成的和元素添加类的方法。 基本上,我需要为1个深度元素、2个深度元素和3个深度元素设置不同的类,还需要检查项目是否有子元素,然后还需要设置不同的类。 然后,我必须将onhtml脚本放在元素中(我知道这些是按钮,但我认为

  • 我对Magento很陌生。我想在Magento中输入WordPress post和自定义post类型。为此,我安装了Magento WordPress集成扩展。我成功地从WordPress中获取帖子,我在Magento根目录中安装了WordPress,使用的数据库与Magento使用的数据库相同。对于自定义帖子类型,我还购买了帖子类型 现在,我的问题是,如何将自定义帖子类型从WordPress导入