我正在编写一个插件,需要根据URL触发一个操作。URL方案如下:
mywordpresssite.com/action/12345
在哪里
12345
是触发的功能使用的唯一代码。我的问题是如何基于这样的链接触发插件中的函数?
EDIT由于下面的答案,我编写了以下3个函数,但我还没有得到我想要的。添加_
function add_endpoint(){
error_log(\'add_endpoint\');
add_rewrite_endpoint( \'action\', EP_ROOT );
}
add_action(\'init\', \'add_endpoint\', 0);
function add_query_vars($vars){
error_log("query");
$vars[] = \'action\';
return $vars;
}
add_filter(\'query_vars\', add_query_vars, 0);
function sniff_requests(){
global $wp;
error_log("request sniffed:".$wp->query_vars[\'action\']);
}
add_filter(\'parse_request\', sniff_requests, 0);
日志显示所有功能都已触发,但无法显示
$wp->query_vars[\'action\']
. 我的猜测是,系统无法识别重写规则:
[26-Aug-2013 22:22:35 UTC] add_endpoint
[26-Aug-2013 22:22:35 UTC] query
[26-Aug-2013 22:22:35 UTC] request sniffed:
最合适的回答,由SO网友:gmazzap 整理而成
正如@toscho所说,您需要一个端点。
注释代码为untested.
/**
* Flush rewrite rules
*/
function install_my_plugin() {
my_plugin_endpoint();
flush_rewrite_rules();
}
register_activation_hook( __FILE__, \'install_my_plugin\' );
/**
* Flush rewrite rules
*/
function unistall_my_plugin() {
flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, \'unistall_my_plugin\' );
/**
* Add the endpoint
*/
function my_plugin_endpoint() {
add_rewrite_endpoint( \'action\', EP_ROOT );
}
add_action( \'init\', \'my_plugin_endpoint\' );
function my_plugin_proxy_function( $query ) {
if ( $query->is_main_query() ) {
// this is for security!
$allowed_actions = array(\'123\', \'124\', \'125\');
$action = $query->get(\'action\');
if ( in_array($action, $allowed_actions) ) {
switch ( $action ) {
case \'123\' :
return call_user_func(\'function_123\');
case \'124\' :
return call_user_func(\'function_124\');
case \'125\' :
return call_user_func(\'function_125\');
}
}
}
}
add_action( \'pre_get_posts\', \'my_plugin_proxy_function\' );