如何处理路由在WordPress插件与URL重写规则


How to handle routing in WordPress Plugin with URL rewrites rules

我是wordpress插件新手。我有什么问题是正确的方式来访问wordpress插件?假设在我的插件中,我需要创建端点来处理不同的回调。我尝试了很多谷歌搜索结果,但都不起作用。我不知道哪里出了问题。请帮助。

<?php
/*
Plugin Name: MyPlugin
Description: MyPlugin
Author: Myself
Author URI:
Version: 1.0
License:
License URI:
*/
class MyPlugin {
  private static $instance;
  public static function getInstance() {
    if(self::$instance == NULL) {
      self::$instance = new self();
    }
    return self::$instance;
  }
  private function __construct() {
    add_action( 'init', array($this, 'set_endpoint' ) );
  }
  function set_endpoint() {
     add_rewrite_rule( 'callback/$', plugin_dir_url(__FILE__) . 'callback.php', 'top' );
  }
  static function activate() {
    global $wp_rewrite;
    $wp_rewrite->flush_rules(true);
  }
}
MyPlugin::getInstance();
register_deactivation_hook(__FILE__,'flush_rewrite_rules');
register_activation_hook(__FILE__,'MyPlugin::activate');

callback.php

<?php  echo '<h1> Hello </h1>'; ?>

好了,我找到答案了。

<?php
class MyPlugin {
  private static $instance;
  public static function getInstance() {
    if(self::$instance == NULL) {
      self::$instance = new self();
    }
    return self::$instance;
  }
  private function __construct() {
    add_action( 'init', array($this,'callback_init_internal' ) );
    add_filter( 'query_vars', array($this,'callback_query_vars' ) );
    add_action( 'parse_request', array($this,'callback_request' ) );
  }
  function callback_init_internal()
  {
      add_rewrite_rule( 'callback.php', plugin_dir_url(__FILE__) . 'callback.php?callback=$matches[1]', 'top' );
  }
  function callback_query_vars( $query_vars )
  {
      $query_vars[] = 'callback';
      return $query_vars;
  }
  function callback_request( &$wp )
  {
      if ( array_key_exists( 'callback', $wp->query_vars ) ) {
        header('content-type: text/html; charset=utf-8');
        $value = $wp->query_vars['callback'];
        if ( $value === 'return' ) {
            echo 'Return URL';
        } else if ( $value === 'notify' ) {
            echo 'Notify URL';
        } else {
            echo '404 Invalid endpoint';
        }
        exit();
      }
      return;
  }
  static function activate() {
    global $wp_rewrite;
    flush_rewrite_rules();
    $wp_rewrite->flush_rules(true);
  }
}

MyPlugin::getInstance();
register_deactivation_hook(__FILE__,'flush_rewrite_rules');
register_activation_hook(__FILE__,'MyPlugin::activate');

从浏览器访问URL

接受参数=通知或返回

http://localhost: 8080/wordpress/callback.php吗?回调=通知通知URL

http://localhost: 8080/wordpress/callback.php吗?回调=什么404无效端点

您可以使用这个插件,以获得更易于阅读和更简单的方法,https://github.com/jbrinley/WP-Router

这个博客可能有帮助,https://www.pmg.com/blog/a-mostly-complete-guide-to-the-wordpress-rewrite-api/