我也在挣扎,几乎放弃了。加入我的探索之旅吧!(或直接跳到The Solution)
<小时/>
The Problem:
通常,创建新端点时,只需转到“设置”下的“永久链接”页面,即可修复该端点不起作用的问题>;永久链接,只需保存永久链接设置。这在WP代码的某个地方必须调用
flush_rewrite_rules()
. 这让我觉得很恶心,因为如果你的插件将被不止一个人(你)使用,或者通常被非PHP开发人员使用,他们将不知道在激活你的插件后保存永久链接规则。你的插件应该在激活后就可以运行了,不需要任何奇怪的神秘的第二步。
WordPress似乎需要你add_rewrite_rule()
在…上init
但是,每次加载页面时,您还需要flush_rewrite_rules()
最初添加重写规则后。。。但是,正如@Rarst所说,你不应该flush_rewrite_rules()
在每一页上init
.
<小时/>
The Solution:
所以,我想出了这项技术,并对其进行了测试。这种技术不需要使用set\\u transient,尽管您可以像其他人一样轻松地使用它。
First, 您希望插件具有激活器。无论是类还是函数,都应该有一个在激活插件时调用的函数:
(相应地替换泛型变量、类和函数名)
register_activation_hook( __FILE__, \'activate\' );
function activate() {
//this function will be called at activation, and then on every init as well:
Plugin_Class_Public::add_endpoint();
//run this at activation ONLY, AFTER setting the endpoint - needed for your endpoint to actually create a query_vars entry:
flush_rewrite_rules();
}
以下是添加端点的函数:
public static function add_endpoint() {
//be sure to replace your_endpoint_slug with your own endpoint
add_rewrite_endpoint(\'your_endpoint_slug\', EP_PERMALINK | EP_PAGES);
}
然后,通过调用上述函数在init上注册端点:
add_action(\'init\', array(\'Plugin_Class_Public\', \'add_endpoint\'));
并确保为template\\u设置挂钩,包括:
add_action(\'template_include\', array(\'Plugin_Class_Public\', \'endpoint_output\'));
它将调用如下所示的函数:
public static function endpoint_output($template) {
if(!is_home()){ //we probably don\'t want this to run on our homepage
global $wp;
global $wp_query;
$output = "";
/*note: your_endpoint_slug needs to be replaced here as you did above.
Its value will be set to whatever comes after it in the url,
eg: www.website.com/your_endpoint_slug/some_more/url -
$wp_query->query_vars[\'your_endpoint_slug\'] = "some_more/url"
*/
if (isset($wp_query->query_vars[\'your_endpoint_slug\'])) {
$output = Plugin_Class_Public::generate_output(wp_query->query_vars[\'your_endpoint_slug\']);
echo $output;
exit;
}
//print output
}
//nothing matched our endpoint, or it\'s the homepage:
return $template;
}
此函数用于生成输出:
public static function generate_output($url_after_endpoint_in_url) {
$output = "";
//do something to generate your desired output and return it
return $output;
}
您还可以通过调用flush\\u rewrite\\u rules()来注销停用时的端点,使其更加整洁,尽管这似乎无法正常工作,因为上面的init()函数在您停用时也会运行,因此它仍在保存该端点。欢迎就如何解决此问题提出建议。尽管如此,一旦该插件被停用,它将不再运行template\\u include中的函数,因此不会造成真正的伤害,IMO。您始终可以保存永久链接,以便稍后删除此无关的query\\u var。
register_deactivation_hook( __FILE__, \'deactivate\' );
function deactivate() {
flush_rewrite_rules();
}
(关于register\\u activation/deactivation\\u hook functions的注意:每个函数中的第一个参数都是指主插件文件,即您在其中放置插件标题注释的文件。通常这两个函数将从主插件文件中触发;但是,如果函数放置在任何其他文件中,则必须更新第一个参数以正确指向到主插件文件。)