如何在WordPress中创建虚拟页面
#网络开发人员 #编程 #php #wordpress

作为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仪表板中激活插件。

之后,该插件应在仪表板上激活时显示:

Screenshot showing activated plugin

可以在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 ☕️表示赞赏。

您的支持对我来说意义重大! €