我目前正在建设一个网站,并已收到一个定制URL struct 显示的请求.以下是我目前的设置:

  1. 在wp—admin仪表板中,一般的permalinks struct 设置设置为'Post name'.
  2. 我创建了一个自定义的帖子类型,名为"information",代码如下:
function create_custom_post_type_information() {
    $labels = array(
        'name'               => __( 'お知らせ一覧' ),
        'singular_name'      => __( 'お知らせ一覧' ),
        'menu_name'          => __( 'お知らせ一覧' ),
        'add_new'            => __( '新規追加' ),
        'add_new_item'       => __( '新しいお知らせ一覧を追加' ),
        'edit'               => __( '編集' ),
        'edit_item'          => __( 'お知らせ一覧の編集' ),
        'new_item'           => __( '新しいお知らせ一覧' ),
        'view'               => __( '表示' ),
        'view_item'          => __( 'お知らせ一覧を表示' ),
        'search_items'       => __( 'お知らせ一覧を検索' ),
        'not_found'          => __( 'お知らせ一覧が見つかりません' ),
        'not_found_in_trash' => __( 'ゴミ箱にお知らせ一覧が見つかりません' ),
    );
    $args = array(
        'labels'              => $labels,
        'public'              => true,
        'has_archive'         => false,
        'menu_position'       => 5,
        'supports'            => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments', 'revisions' ),
        'rewrite'             => array( 'slug' => 'information'),
        'show_in_rest'        => true,
    );
    register_post_type( 'information', $args );
}
add_action( 'init', 'create_custom_post_type_information' );

// カスタムタクソノミー:お知らせ一覧のカテゴリー / information_category
function create_custom_taxonomy_information_category() {
    $labels = array(
        'name'              => __( 'お知らせ一覧カテゴリー' ),
        'singular_name'     => __( 'お知らせ一覧カテゴリー' ),
        'search_items'      => __( 'お知らせ一覧カテゴリーを検索' ),
        'all_items'         => __( 'すべてのお知らせ一覧カテゴリー' ),
        'parent_item'       => __( '親カテゴリー' ),
        'parent_item_colon' => __( '親カテゴリー:' ),
        'edit_item'         => __( 'お知らせ一覧カテゴリーを編集' ),
        'update_item'       => __( 'お知らせ一覧カテゴリーを更新' ),
        'add_new_item'      => __( 'お知らせ一覧カテゴリーを追加' ),
        'new_item_name'     => __( '新しいお知らせ一覧カテゴリー' ),
    );
    $args = array(
        'hierarchical'      => true,
        'labels'            => $labels,
        'show_ui'           => true,
        'show_admin_column' => true,
        'query_var'         => true,
        'rewrite'           => array( 'slug' => 'info-ctg' ),
        'show_in_rest'      => true,
    );
    register_taxonomy( 'info_ctg', array( 'information' ), $args );
}
add_action( 'init', 'create_custom_taxonomy_information_category' );
  1. 我还创建了一个名为"信息"的新页面.因此,我设置了has_archive' => false,并使用以下代码处理分页:

add_rewrite_rule( 'information/page/([0-9]+)/?$', 'index.php?pagename=information&paged=$matches[1]', 'top' );

到目前为止,我所做的工作是有效的,但现在我困惑于如何定制只有这篇文章的格式如下:

/information/yyyyy/mm/dd/post_id

我试过以下代码,但它没有工作,并显示了一个404页面:

function custom_permalink_structure($permalink, $post) {
    // For single information posts
    if ($post->post_type === 'information') {
        $permalink = home_url('/information/' . date('Y/m/d', strtotime($post->post_date)) . '/' . $post->ID);
    }

    return $permalink;
}
add_filter('post_type_link', 'custom_permalink_structure', 10, 2);

我一直在跟踪这个https://wordpress.stackexchange.com/a/22490,但它没有工作.

有谁能帮我定制一下这个 struct 吗?谢谢.

推荐答案

问题原因:

首先,让我解释一下为什么会出现这个问题.因为你没有实现解决方案的后半部分,即重写规则.

漂亮的URL:

前半部分,即post_type_link只处理定制帖子类型的特定帖子的URL.这意味着您已经完成了自定义URL或漂亮URL的创建.

仅供参考,WP提供了一些内置的structure tags,你可以利用它来构建漂亮的链接,而不是date('Y/m/d', strtotime($post->post_date)),但这取决于你,因为你的实现方式在技术上也是正确的,但大多数人喜欢使用 struct 标签,如果它是可用的.

重写规则:

第二部分或遗漏的部分是你没有添加重写规则逻辑,它由像Apache这样的Web服务器处理,以映射/路由URL及其执行点.

Important: 为了看到代码被操作,您必须刷新重写规则.你可以在许多方面做到这一点,我的首选是WP CLI命令wp rewrite flush

规则可以通过各种方式添加,但我更喜欢{$permastructname}_rewrite_rules,因为它只获取特定的 struct 名规则,这在调试期间很美观,而不是一次看到整个规则(只是个人偏好总是 Select 更具体的挂钩,而不是泛型挂钩,以避免失败的调试)

在我们的上下文中,这个钩子大致转换为information_rewrite_rules,其中information是前缀为_rewrite_rules的POST类型.

解决办法是:

function custom_rewrite_rules( $rules ) {
    $rules['information/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/([0-9]{1,})/?$'] = 'index.php?post_type=information&p=$matches[4]';
    return $rules;
}
add_filter( 'information_rewrite_rules', 'custom_rewrite_rules', 20 );

让我解释一下hook information_rewrite_rules回调的代码.

  1. 定制正则表达式模式information/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/([0-9]{1,})/?$被映射到index.php?post_type=information&p=$matches[4]
  2. 其呈现帖子类型(post_type=information)的单个帖子(p=$matches[4])
  3. 这里是公共查询变量的ppost_type,这意味着我们可以直接在URL查询字符串中传递它(完整列表https://codex.wordpress.org/WordPress_Query_Vars)

要查看规则及其正则表达式解释,请单击此链接并查看右侧的解释面板: https://regex101.com/r/3Eyk32/1


想了解更多关于WP重写API的信息,请查看以下链接:

  1. https://developer.wordpress.org/apis/rewrite/
  2. https://developer.wordpress.org/reference/classes/wp_rewrite/
  3. 第三方教程Mastering WordPress rewrite rules

遇到麻烦或想调试,以便更好地理解我会建议这两个插件:

  1. https://wordpress.org/plugins/monkeyman-rewrite-analyzer/
  2. https://wordpress.org/plugins/query-monitor/

重写分析器是非常过时的插件,两者都是开发相关的插件,因此不要在生产中使用它.

Rewrite Analyzer Query Monitor

Php相关问答推荐

为什么注册SIGHUP的处理程序函数会阻止在PHP CLI中等待输入时点击X关闭Xterm窗口?""

模型中的Laravel自定义查询字段

Symfony/Panther Web抓取不适用于登录后的内容(云功能)

在Laravel中修改JSON输出

无法使用php IMAP从Gmail获取收件箱

按列值将二维数组排序为不超过N个的递增组

如何将WooCommerce产品从一个产品复制到另一个产品S

根据WooCommerce的定制订单状态增加产品库存

打折时更改 Woocommerce 产品名称

在 PHP 中将字符串分解为数组(字符串类似于 WP 短代码)

PHP 数组中第一级 node 到 XML 的唯一名称

Woocommerce 相关产品按其类别或排名数学主要类别

如何在 PHP laravel 中将图像的透明背景转换为白色?

Windows 身份验证在 IIS 中验证什么?我可以在我的情况下禁用匿名身份验证吗?

Laravel使用另一张表进行关联查询

用于检测此模式的正则表达式:something;something=something,something=something... 未知次数

PHP / DOM : 解析 HTML 以提取基于类的数​​据

Php 的新WeakMap - 枚举曾经被垃圾收集过吗?

PHP 中的 curl 验证失败(openssh 连接正常)

在 EasyAdmin 中添加全局操作,将我的按钮放在表格下方而不是上方