gmazzap/url-to-query

允许解析任何类型的WordPress URL到相关的主要查询参数。

安装: 2,425

依赖关系: 0

建议者: 0

安全性: 0

星标: 31

关注者: 5

分支: 6

类型:wordpress-plugin

1.0.1 2016-12-06 09:02 UTC

This package is auto-updated.

Last update: 2024-08-26 14:13:28 UTC


README

这是一个WordPress插件,允许将任何类型的WordPress URL(甚至来自自定义重写规则)解析到相关的主要查询参数。

#需求

  • PHP 5.4+
  • WordPress 3.9+
  • 需要 Composer 来安装

#安装

该插件是一个Composer包,可以通过以下方式安装到插件目录中:

composer create-project gmazzap/url-to-query --no-dev

什么和为什么

WordPress自带了一套工具,可以将自定义URL转换为特定的查询变量:可以更改永久链接结构,并且还有一个API可以添加完全自定义的规则,但是,没有一种方法可以反转这个过程:即知道任意URL与哪些查询参数相关联。

URL解析是通过全局变量中的$wp变量中保存的WP类的parse_request方法在核心中完成的。

使用该方法进行上述目的很困难/不被推荐,因为

  • 它直接访问到$_SERVER$_POST$_GET变量,使得解析与当前HTTP请求无关的任意URL变得困难
  • 它触发了一些与当前HTTP请求解析严格相关的动作钩子,对于任意URL来说没有意义
  • 它访问和修改了全局$wp变量的属性,这些属性在请求解析后不应该改变,否则很可能会出问题

这就是我编写这个简单插件的原因,它添加了一个模板标签url_to_query,该标签接受一个URL并返回相关的主要查询参数。

##如何使用##

$args = url_to_query( 'http://example.com/sample-page' );
// $args = array(  'pagename' => 'sample-page' );

$args = url_to_query( 'http://example.com/category/uncategorized/' )
// $args = array(  'category_name' => 'uncategorized' );

也可以传递一个相对URL

$args = url_to_query( '/sample-page' );
// $args = array(  'pagename' => 'sample-page' );

###使用查询字符串###

当不使用美观的永久链接时,(有时甚至在这种情况下)WordPress可以使用URL中的查询字符串来设置查询参数。该插件与它们完美配合

$args = url_to_query( '/?attachment_id=880' );
$args = array(  'attachment_id' => '880' );

为了简化这个任务,url_to_query接受第二个参数:一个数组,其中包含在解析URL时与核心处理$_REQUEST变量相同方式处理的查询变量

$args = url_to_query( '/', array( 'attachment_id' => '880' ) );
// $args = array(  'attachment_id' => '880' );

请注意,作为第二个参数传递的数组不会被直接合并到查询变量中,只有有效的查询变量将被使用,就像核心在解析URL时一样

$args = url_to_query( '/', array( 'attachment_id' => '880', 'foo' => 'bar' ) );
// $args = array(  'attachment_id' => '880' );

###自定义重写规则###

插件与自定义重写规则没有问题,只需考虑以下几点

  • url_to_query必须在添加查询规则之后调用,否则它无法识别它们
  • 就像核心一样,重写规则必须刷新后url_to_query才能识别新添加的规则
  • 就像核心一样,如果规则包含自定义查询变量,它们必须被允许,可能使用add_rewrite_tag或使用'query_vars'过滤器(见Codex示例

示例

add_action( 'init', 'my_rew_rules' );

function my_rew_rules() {
  add_rewrite_tag('%food%', '([^&]+)');
  add_rewrite_tag('%variety%', '([^&]+)');
  add_rewrite_rule(
    '^nutrition/([^/]*)/([^/]*)/?',
    'index.php?page_id=12&food=$matches[1]&variety=$matches[2]',
    'top'
  );
}

add_action( 'footer' function() {
  $args = url_to_query( '/nutrition/cake/cherry/' )
  // $args = array( 'page_id' => '12', 'food' => 'cake', 'variety' => 'cherry' );
} );

###插件类###

即使插件提供了 'url_to_query' 模板标签,它内部仍然使用两个类来解析URL,可以直接使用它们,而不是模板标签。实际上,只应该使用其中一个,另一个是内部使用的。

$resolver = new GM\UrlToQuery();
$args = $resolver->resolve( 'http://example.com/sample-page', array( 'page' => '2' ) );
// $args = array( 'pagename' => 'sample-page', 'page' => '2' );

因此,GM\UrlToQueryresolve() 方法与 url_to_query 函数的运行方式完全相同。

可以使用同一个 GM\UrlToQuery 实例来解析不同的URL。

$resolver = new GM\UrlToQuery();

$args1 = $resolver->resolve( 'http://example.com/sample-page', array( 'page' => '2' ) );
// $args1 = array( 'pagename' => 'sample-page', 'page' => '2' );

$args2 = $resolver->resolve( '/?attachment_id=880' );
// $args2 = array( 'attachment_id' => '880' );

$args3 = $resolver->resolve( 'http://example.com/category/uncategorized/' );
// $args3 = array( 'category_name' => 'uncategorized' );

================

许可证

Url_To_Query 采用 MIT 许可协议发布。