Wordpress插件使用重写规则创建虚拟页面

时间:2019-03-14 15:45:25

标签: php wordpress

我正在创建一个插件,该插件需要虚拟页面才能在前端输出内容。

这是我的代码:

add_filter( 'generate_rewrite_rules', function ( $wp_rewrite ) {
$wp_rewrite->rules = array_merge(
    ['my-custom-url/?$' => 'index.php?custom=1'],
    $wp_rewrite->rules
);
} );

add_filter( 'query_vars', function( $query_vars ) {
$query_vars[] = 'custom';
return $query_vars;
} );

add_action( 'template_redirect', function() {
$custom = intval( get_query_var( 'custom' ) );
if ( $custom ) {
    include plugin_dir_path( __FILE__ ) . 'templates/states.php';
    exit();
 }
} );

在插件中,我有template / states.php,在该文件中,我有:

<?php
$state = get_query_var( 'custom' );

echo $state;
?>

当我访问localhost / my-custom-url / somevariable时,出现从Wordpress找不到的页面。我试过刷新我的永久链接。

2 个答案:

答案 0 :(得分:0)

正如我在评论中所说

  

我从没用过generate_rewrite_rule

关于它的文档也很薄弱。但是这个键看起来就像我期望的常规表达式一样。而且,这很有意义,因为这就是真正的Mod Rewrite和Htaccess的工作方式。

add_filter( 'generate_rewrite_rules', function ( $wp_rewrite ) {
  $wp_rewrite->rules = array_merge(
    ['my-custom-url/?$' => 'index.php?custom=1'],
    $wp_rewrite->rules
  );
} );

因此,这里的$与字符串的末尾匹配,这意味着您的URL必须以my-custom-url结尾,并且由于/而具有可选的?

  

当我访问localhost / my-custom-url / somevariable时,找不到页面

不足为奇,因为您的URL不会以与该模式匹配的方式结束。

Test it yourself!

因此,您可以删除$,而不必保留/

add_filter( 'generate_rewrite_rules', function ( $wp_rewrite ) {
  $wp_rewrite->rules = array_merge(
    ['my-custom-url/?' => 'index.php?custom=1'],
    $wp_rewrite->rules
  );
} );

请注意,这将使URL中的任何地方都匹配

Test this one

希望它能起作用。

答案 1 :(得分:0)

我想从虚拟页面发送Ajax,有什么办法可以实现吗?

add_action('wp_enqueue_scripts', 'insert_javascript');
function insert_javascript() {   
    wp_enqueue_script( 'get-users-api', plugin_dir_url( __FILE__ ) . 'js/main.js', array('jquery') );
    wp_localize_script( 'get-users-api', 'js', array(
        'ajaxurl' => admin_url( 'admin-ajax.php' )
    ));
}

但由于我在 parse_request 中调用 exit,该代码永远不会在该页面上执行。有什么建议吗?