如何使用URL触发操作

时间:2013-08-26 作者:znat

我正在编写一个插件,需要根据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:

1 个回复
最合适的回答,由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\' );

结束

相关推荐

Plugins_url()可以在除wp_reqister_script()之外的任何地方运行

所以我应该提前提到,我正在开发一个插件,所以我的url是“mysite”。com/plugin“(以防万一这与我的问题有关。因此,在我的主插件文件(myplugin.php)中,我添加了以下内容:$plugin_url = plugins_url(\'/my-plugin-directory/\'); 紧接着wp_enqueue_style(\'wp_enqueue_scripts\', $plugin_url . \'css/boxes.css\'); 很好,到目前为止还不错。插件u