gmazzap / url-to-query
允许解析任何类型的WordPress URL到相关的主要查询参数。
Requires
- composer/installers: ~1.0
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\UrlToQuery
的 resolve()
方法与 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 许可协议发布。