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

I'm creating a plugin that will need virtual pages to output content on the front end.

Here is my code:

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();
 }
} );

In the plugin I have templates/states.php and in that file I have:

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

echo $state;
?>

When I visit localhost/my-custom-url/somevariable I get a page not found from Wordpress. I've tried flushing my permalinks.

As I said in the comments

I have never used generate_rewrite_rule

The documentation on it is pretty weak too. But this key looks just like I would expect a Regular expresion to be. And, that makes sense as that is how real Mod Rewrite and Htaccess work.

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

So this $ here matches the end of the string, this means your URL must end with my-custom-url with an optional / because of the ?.

When I visit localhost/my-custom-url/somevariable I get a page not found

That's not surprising as your URL does not end in a way that will match that pattern.

Test it yourself!

So you can just remove the $ you may or may not want to keep the / optional.

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

One note is this will make that match anywhere in the URL

Test this one

Hope it works.