作为WordPress插件开发人员,您可能需要创建未存储在数据库中的自定义页面。本指南向您展示了如何通过插件动态生成的WordPress编程创建虚拟页面。
我为什么需要这个?
WordPress是一个功能强大的CMS,因此提供了许多在您的网站上获取内容的方法!但是,如果您正在开发复杂的WordPress插件,那么这些插件可能并不总是足够。
想象一下:您想将票务系统构建为WordPress插件,并且您希望每张售票在WordPress网站中都有一个页面供客户或员工查看。
URL的模式将是这样的:https://example.fabiancdng.com/ticket/{id}
在这种情况下,最好只有一个php模板即可使用id
,从任何来源查询数据并动态呈现页面而无需将任何内容存储在WordPress数据库中。
步骤1:创建WordPress插件
第一步当然是创建WordPress插件来托管我们的虚拟页面。
如果您已经有一个插件,则可以跳过此步骤。如果不是,则可以按照以下步骤来创建一个新插件:
- 在WordPress安装的“ WP-CONTENT/插件”目录中创建一个新文件夹。
- 在文件夹中创建一个新的PHP文件,并给它一个唯一的名称。
- 打开PHP文件,并在顶部添加插件标头信息。这包括插件名称,版本,作者和描述。
- 保存PHP文件并在WordPress仪表板中激活插件。
之后,该插件应在仪表板上激活时显示:
可以在WordPress documentation中随意通过这些步骤。
步骤2:创建重写规则
WordPress为此目的提供了Rewrite API。
您可以将其利用为编程为“重定向” WordPress安装中的特定slug,然后将其动态呈现在此页面上的内容。
要实现此目标,请连接到调用add_rewrite_rule()
方法的init
钩。
function ticket_plugin_add_rewrite_rules() {
// Slug of your virtual page (e.g. 'ticket').
$slug = 'ticket';
// Add rewrite rule (hook up the virtual page to a slug in WordPress).
// Do some Regex magic to pass args within the URL for pretty URLs.
add_rewrite_rule(
$slug . '/([^/]*)[/]?$',
'index.php?ticket-id=$matches[1]',
'top'
);
}
add_action( 'init', 'ticket_plugin_add_rewrite_rules' );
此示例坚持我们的示例URL模式https://example.fabiancdng.com/ticket/{id}
。
第一个参数:URL
第一个参数表示将安装虚拟页面的sl(在此示例中,/ticket
)。此参数允许将正则匹配。我们可以使用它来允许URL中的任何变量以及获取参数。
第二个参数:查询变量
第二个参数指定加载虚拟页面时查询字符串WordPress接收。
查询字符串应包含变量(例如示例中)。那些所谓的“查询变量”是WordPress在引擎盖下使用的内容来确定要加载的内容。 WordPress具有很多内置的,但插件也可以具有自己的查询变量(如此处)。
有关查询变量的更多信息:https://codex.wordpress.org/WordPress_Query_Vars
在此示例中,这对于映射网址的一部分是很有用的,即是查询var ticket-id
的票证ID,我们可以在虚拟页面上访问,以了解需要呈现哪些特定票证。
步骤3:定义自定义查询变量
要告诉WordPress关于我们的自定义查询变量ticket-id
,我们需要使用query_vars
钩注册它:
function ticket_plugin_add_query_vars( $vars ) {
$vars[] = 'ticket-id';
return $vars;
}
add_filter( 'query_vars', 'ticket_plugin_add_query_vars' );
在此示例中,这只是告诉WordPress识别我们的ticket-id
查询变量。
步骤4:创建虚拟页面的模板
现在,我们需要设置当用户访问我们虚拟页面时呈现实际内容的PHP模板。
告诉WordPress,我们想使用此页面的自定义模板文件,而不是从主题中使用模板,我们可以在WordPress中使用template_redirect
钩。
function ticket_plugin_template_redirect() {
if ( get_query_var( 'ticket-id' ) ) {
include_once plugin_dir_path( __FILE__ ) . 'templates/ticket-page-template.php';
exit;
}
}
add_action( 'template_redirect', 'ticket_plugin_template_redirect' );
不要忘记在插件目录中创建模板文件。在此示例中,我还添加了一个专用的templates
文件夹。
/wp-content/plugins/ticket-plugin/templates/ticket-page-template.php :
的蓝图
<?php
/**
* Template Name: My Virtual Page
*/
// Include WordPress header (if you want to).
get_header();
// Get the ticket ID from our query var.
// You can call a filter/function here to get the data for the ticket.
$ticket_id = get_query_var( 'ticket-id' );
// HTML output here.
// For demonstration purposes, I only output the ticket ID here.
echo $ticket_id;
// Include WordPress footer (if you want to).
get_footer();
步骤5:冲洗重写规则
Flushing重写规则是在WordPress插件中创建自定义路由或虚拟页面时的重要步骤。
WordPress加载时,它会解析URL并根据重写规则进行检查以确定要显示的内容。当您在插件中创建新的自定义路由或虚拟页面时,需要刷新重写规则,以确保WordPress识别新路由或页面。
冲洗重写规则重建URL结构并更新内部缓存,使新内容可用于显示。如果不齐平的重写规则可能会导致404个错误或无法访问新内容。要刷新重写规则,您可以在插件代码中使用flush_rewrite_rules()
功能。重要的是要注意,此功能仅应谨慎使用,因为它可能是资源密集的,并且如果使用频率过于频率,则可以放慢速度。
因此,我建议将其与插件激活挂钩结合使用(用户在WordPress仪表板上激活插件时执行)。
function ticket_plugin_activate() {
// Flush the rewrite rules.
// Slow and resource heavy, therefore only called on activation and deactivation.
flush_rewrite_rules();
}
register_activation_hook(
__DIR__ . '/ticket-plugin.php', // Main plugin file.
'ticket_plugin_activate'
);
可以了,好了! ð¥³
您现在应该能够在指定的slug下到达虚拟页面。
如果您遇到404错误,只需前往WordPress仪表板并再次停用插件。 这将再次冲洗重写规则,如果不是,则可能会注册您的虚拟页面尚未注册。
我根据本指南创建了一个示例WordPress插件,可以在GitHub上找到。如果您想查看所有代码件都聚集在一起,请随时检查一下:https://github.com/fabiancdng/wp-virtual-page-example-plugin
欢呼。
ð£此帖子最初于2023年4月2日在my website上发布。
如果您发现这篇文章有帮助,请考虑以下更多内容,并给予帖子。
您也可以通过leaving me a tip for my next coffee ☕️表示赞赏。
您的支持对我来说意义重大! €