Wordpress 添加重写规则对我不起作用

Wordpress add rewrite rule doesn't work for me

我正在开发一个创建 2 个页面的插件:一个列表页面和一个详细信息页面。

我不使用自定义类型。我在数据库中创建了一个 table,我在其中保存了公司详细信息以及详细信息页面的 slug。

它工作正常,但 URL 有问题。他们不漂亮。

在列表页面上,我使用此代码创建 link:

    <a href="https://www.website.com/company/details/?companyname=<?php echo $value->company_slug; ?>"><?php echo stripslashes($value->company_name); ?></a>

生成的 link 如下所示:

    https://www.website.com/company/details/?companyname=new-company-name

我使用查询是因为我在详细信息页面上需要它,我在其中使用此代码:

    $company_slug = $_GET['companyname'];
    $company_details = $wpdb->get_row("SELECT * FROM $table_company WHERE company_slug = '$company_slug'");

这就是我从 sql 中检索公司详细信息的方式,它也工作得很好。

我在Wordpress中手动创建了详细信息页面。

问题是我想让细节 URL 看起来漂亮,像这样:

    https://www.website.com/company/details/new-company-name/

像这样生成它很容易,但是当我点击时,我得到一个 404,因为缺少来自 URL 的查询。

我认为直接创建漂亮的 URL 并在详细信息页面上解析 URL 并获取公司 slug 很容易。它没有用。我收到 404 可能是因为该页面实际上不存在。

所以,我做了一些关于 URL 重写的研究,我找到了一些例子,但 none 有效。

我发现也试过这个代码:

    add_filter('query_vars', function($vars) {
        $vars[] = "companyname";
        return $vars;
    });

    function custom_rewrite_rule() {
        add_rewrite_rule('^companyname/?([^/]*)/?','company/details/?companyname=$matches[1]','top');
    }
    add_action('init', 'custom_rewrite_rule', 10, 0);

我读到如果我使用自定义 URL 而不是 index.php,我不应该使用火柴,所以我也尝试过不使用火柴:

    add_rewrite_rule('^companyname/?([^/]*)/?','company/details/?companyname=','top');

没有结果。如果当然,每次更改后我都会再次保存 permalinks。

这应该是一个简单的任务,但不知何故它不起作用。

    https://developer.wordpress.org/reference/functions/add_rewrite_rule/

有谁知道我怎样才能完成这项工作?

谢谢。

此致, AG

我假设您创建的详细信息页面有 slug company/details。这是你需要做的才能让它发挥作用-

1.在 functions.php 文件中添加自定义重写规则:

function theme_custom_rewrites() {
    add_rewrite_tag("%companyname%", "([a-z0-9\-_]+)");
  add_rewrite_rule('^company/details/([a-z0-9\-_]+)/?$', 'index.php?pagename=company/details&companyname=$matches[1]', 'top');
}

add_action('init', 'theme_custom_rewrites'); 

它注册了一个名为 companyname 的新重写 tag/query var 供以后使用,并为您想要的特定 URL 结构注册自定义重写规则 (/company/details/company_name) .

2。获取模板文件上的公司名称并使用: 添加上述代码并保存永久链接后,只需使用get_query_var() 函数即可获取公司名称。

$companyname = get_query_var( 'companyname' );

希望对您有所帮助。谢谢。

非常感谢您的快速回复。有效。

当然,我不得不将列表页面上的 link 更改为:

    <a href="https://www.website.com/company/details/<?php echo $value->company_slug; ?>"><?php echo stripslashes($value->company_name); ?></a>

我已经从 link 中删除了查询,现在看起来像这样:

    https://www.website.com/company/details/new-company-name/ 

我不明白的是,WP 如何知道哪个是查询,因为我从 link.

中删除了它

如果我访问

我可以看到相同的数据
    https://www.website.com/company/details/?companyname=new-company-name

    https://www.website.com/company/details/new-company-name/

但是,基本上,这部分 (?companyname=) 在 link 中不再存在,因为我更改了它。

我的插件现在没有查询,但不知何故一切正常。 :)

我没有在某处声明它。它完全消失了并且有效。

此代码如何知道查询存在并从数据库中检索 slug?

    $companyname = get_query_var( 'companyname' );

我现在只有这个代码:

    <a href="https://www.website.com/company/details/<?php echo $value->company_slug; ?>"><?php echo stripslashes($value->company_name); ?></a>

因此,URL 中没有查询。

感谢您的宝贵时间。

此致, AG