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

时间:2019-08-05 14:51:03

标签: wordpress plugins url-rewriting permalinks

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

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

它工作正常,但是我的网址有问题。他们不漂亮。

在列表页面上,我使用以下代码创建链接:

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

生成的链接如下:

    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并获取公司信息很容易。没用我得到404,可能是因为该页面实际上不存在。

因此,我已经完成了有关URL重写的一些研究,发现了一些示例,但没有一个奏效。

我发现还尝试了以下代码:

    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=$1','top');

没有结果。如果可以的话,每次更改后,我都会再次保存永久链接。

这应该是一件容易的事,但是不成功。

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

你们当中有人知道我该怎么做吗?

谢谢。

关于, AG

2 个答案:

答案 0 :(得分:1)

我假设您创建的详细信息页面上有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的新重写标记/查询变量,以供以后使用,并为您想要的特定URL结构(/company/details/company_name)注册一个自定义重写规则。

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

$companyname = get_query_var( 'companyname' );

希望有帮助。谢谢。

答案 1 :(得分:0)

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

当然,我必须将列表页面上的链接更改为:

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

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

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

我不了解的是WP如何知道哪个查询,因为我从链接中删除了它。

访问后我可以看到相同的数据

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

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

但是,基本上,该部分(?companyname =)在链接中已不存在,因为我已对其进行了更改。

我的插件中现在没有查询,但是某种方式一切正常。 :)

我没有在某处声明它。它已经完全消失,并且可以正常工作。

此代码如何知道该查询存在并且正在从数据库中检索该子弹?

    $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