Wordpress 单篇帖子的自定义端点?

问题描述 投票:0回答:1

我有一个名为“客户”的自定义帖子类型,它只是一群个人客户。这些页面是通过其帖子类型结构访问的:

例如。 /客户/姓名-1

这一切都正常工作,并为此帖子类型加载正确的模板(single-customer.php)

现在我需要扩展它并构建将存在于新模板中的新功能。但是,我不想创建新页面,而是利用保存数据的单个客户页面。

例如。 /客户/姓名-1/工作计划

加载任何 /customer/customer-name/workplan 时,它应该:

  1. 了解单个客户的ID
  2. 加载新模板 - template-customer-workplan.php
  3. 此模板将使用 POST->ID 从单个客户获取一些自定义元字段并填充工作计划模板。

我已经研究了 add_rewrite_rule 和 add_rewrite_endpoint 但没有得到我想要的(尝试过这个,但不认为它对于这个用例来说是正确的)

    function workstreams_rewrite_rules() {
    add_rewrite_rule(
        '^customer/(.*)/?$',
        'index.php?post_type=customer&name=$matches[1]',
        'top'
    );
} add_action( 'init', 'workstreams_rewrite_rules', 10, 0 );

有人输入了我应该探索的正确设置和重写吗?感谢您的阅读!

php wordpress url-rewriting
1个回答
0
投票

使用

add_rewrite_rule()
可能可以实现此目的,但我更喜欢并推荐看似被遗忘的
add_rewrite_endpoint()
函数

测试:

// Register the endpoint.
add_action( 'init', static function () {
    add_rewrite_endpoint( 'workplan', EP_ALL, 'customer_workplan' );
} );

// Register the query var, and if it's present, set it's value to true.
add_filter( 'request', static function ( $vars ) {
    if ( isset( $vars['customer_workplan'] ) ) {
        $vars['customer_workplan'] = true;
    }

    return $vars;
} );

// If request is for a customer's work plan, use the template.
add_filter( 'template_include', static function ( $template ) {
    if ( ! is_singular( 'customer' ) ) {
        return $template;
    }

    if ( ! get_query_var( 'customer_workplan' ) ) {
        return $template;
    }

    return 'template-customer-workplan.php';
} );

想要更全面的模板处理功能,我推荐

single_template_hierarchy
过滤器

add_filter( 'single_template_hierarchy', static function ( $templates ) {
    if ( ! is_singular( 'customer' ) ) {
        return $templates;
    }

    if ( ! get_query_var( 'customer_workplan' ) ) {
        return $templates;
    }

    $new_templates = array();

    foreach ( $templates as $template ) {
        if ( ! str_contains( $template, '-customer' ) ) {
            $new_templates[] = $template;
            continue;
        }

        $new_templates[] = str_replace( '.php', '-workplan.php', $template );
    }

    return $new_templates;
} );
© www.soinside.com 2019 - 2024. All rights reserved.