首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在WordPress中,如何重写自定义post类型的URL以使用漂亮的permalink结构

在WordPress中,如何重写自定义post类型的URL以使用漂亮的permalink结构
EN

Stack Overflow用户
提问于 2019-10-30 15:42:55
回答 1查看 365关注 0票数 0

我在一个站点上有各种定制的post类型,其中包含当前查询ID的URL,并且我试图重写这些URL,以使用相当好的permalink结构。一些示例post URL:

示例1:

电流:https://accountability-framework.org/core-principles/?core_principle=88

期望:https://accountability-framework.org/core-principles/2-respect-for-human-rights

示例2:

电流:https://accountability-framework.org/contents-of-the-framework/free-prior-and-informed-consent/?guidance_topic=0

期望:https://accountability-framework.org/contents-of-the-framework/free-prior-and-informed-consent/1-fpic-definition-and-overview

因此,所需的网址格式是:https://accountability-framework.org/name-of-post-type/name-of-post/name-of-topic-if-present

奇怪的是,当查看WP管理中的帖子时,permalink被正确列出:

但是,完整的页面内容无法正确加载。

在我们的post-types目录中,它位于principles.php (管理上面的第一个示例文章)中:

代码语言:javascript
复制
<?php

/**
 * Principles
 */

namespace App;

add_action( 'init', '\App\principles_post_type' );
function principles_post_type() {
    register_post_type(
        'principle',
        array(
            'labels' => array(
                  'name'               => __( 'Core Principles', TEXT_DOMAIN ),
                  'singular_name'      => __( 'Core Principle', TEXT_DOMAIN ),
                  'add_new'            => __( 'New Principle', TEXT_DOMAIN ),
                  'add_new_item'       => __( 'Add New Principle', TEXT_DOMAIN ),
                  'new_item'           => __( 'New Principle', TEXT_DOMAIN ),
                  'edit_item'          => __( 'Edit Principle', TEXT_DOMAIN ),
                  'view_item'          => __( 'View Principle', TEXT_DOMAIN ),
                  'all_items'          => __( 'All Principles', TEXT_DOMAIN ),
                  'search_items'       => __( 'Search Principles', TEXT_DOMAIN )
            ),
            'public' => true,
            'publicly_queryable'  => true,
            'exclude_from_search' => false,
            'has_archive' => true,
            'hierarchical' => false,
            'rewrite' => array( 'slug' => __( 'core-principles', TEXT_DOMAIN ), 'with_front' => false ),
            'show_in_menu' => true,
            'show_in_admin_bar' => true,
            'supports' => array( 'title', 'revisions' ),
            'menu_position' => 6,
            'menu_icon' => 'dashicons-thumbs-up'
        )
    );
}

这是在guidance.php中(管理上面的第二篇示例文章):

代码语言:javascript
复制
<?php

/**
 * Guidances
 */

namespace App;

add_action('init', '\App\guidance_post_type');
function guidance_post_type() {
    register_post_type(
        'guidance',
        array(
            'labels' => array(
                  'name'               => __('Operational Guidance', TEXT_DOMAIN),
                  'singular_name'      => __('Operational Guidance', TEXT_DOMAIN),
                  'add_new'            => __('New Operational Guidance', TEXT_DOMAIN),
                  'add_new_item'       => __('Add New Operational Guidance', TEXT_DOMAIN),
                  'new_item'           => __('New Opertional Guidance', TEXT_DOMAIN),
                  'edit_item'          => __('Edit Operational Guidance', TEXT_DOMAIN),
                  'view_item'          => __('View Operational Guidance', TEXT_DOMAIN),
                  'all_items'          => __('All Operational Guidance', TEXT_DOMAIN),
                  'search_items'       => __('Search Operational Guidance', TEXT_DOMAIN)
            ),
            'public' => true,
            'publicly_queryable' => true,
            'exclude_from_search' => false,
            'has_archive' => true,
            'hierarchical' => false,
            'rewrite' => array('slug' => __('contents-of-the-framework', TEXT_DOMAIN ), 'with_front' => false),
            'show_in_menu' => true,
            'show_in_admin_bar' => true,
            'supports' => array('title', 'revisions'),
            'menu_position' => 5,
            'menu_icon' => 'dashicons-analytics'
        )
    );
}

permalinks被设置为"Post name":https://accountability-framework.org/sample-post/

关于上面的第一个例子,我还尝试在principles.php中添加一个重写规则

代码语言:javascript
复制
function core_principle_rewrite_tag_rule() {
  add_rewrite_tag( '%core_principle%', '([^&]+)' );
  add_rewrite_rule( '^core_principles/([^/]*)/?', 'index.php?core_principle=$matches[1]','top' );
}
add_action('init', 'core_principle_rewrite_tag_rule', 10, 0);

但没有骰子。如何设置所有这些自定义post类型URL以遵循所需的格式?

我使用的是WordPress版本5.2.4和Sage主题:https://roots.io/sage/

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-10-30 17:44:24

有些服务器(如果权限设置不正确)可能无法工作,您可能需要手动更新.htaccess文件。

代码语言:javascript
复制
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

重要事项:如果您正在修改现有的.htaccess文件,请确保首先在计算机上备份该文件,以防您搞砸任何事情。

自动刷新重写规则

导致404错误的另一个原因是,每当注册新的post类型时,就必须在WordPress中“刷新”重写规则。这可以通过转到Settings > Permalinks并单击保存按钮(在本文的第一节中提到)来完成。

如果您正在处理带有注册帖子类型的自定义主题或插件,您可能需要考虑在最终用户激活主题或插件时自动刷新重写规则,以防止任何404错误。下面是您可以使用的代码示例:

代码语言:javascript
复制
// Code for themes
add_action( 'after_switch_theme', 'flush_rewrite_rules' );

// Code for plugins
register_deactivation_hook( __FILE__, 'flush_rewrite_rules' );
register_activation_hook( __FILE__, 'myplugin_flush_rewrites' );
function myplugin_flush_rewrites() {
    // call your CPT registration function here (it should also be hooked into 'init')
    myplugin_custom_post_types_registration();
    flush_rewrite_rules();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58629040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档