关于WordPress最常见的误解之一是它只是一个博客平台。
虽然WordPress最初是一个博客工具,但多年来它已经发展成为一个强大的网站建设者和最受欢迎的CMS(内容管理系统)。
WordPress最好的部分是它易于使用且足够灵活,可以制作不同类型的网站。
这就是WordPress如此受欢迎的主要原因。在撰写本文时,WordPress为互联网上超过43%的网站提供支持。
由于其强大的功能,许多顶级品牌使用 WordPress 为其网站提供支持,包括时代杂志、Facebook、纽约客、索尼、迪士尼、塔吉特、纽约时报等。
考虑到这一点,让我们来看看为什么你应该使用WordPress来制作你的网站。
WordPress 是自由的
WordPress是免费的开源软件。这意味着您可以自由下载、安装、使用和修改它以满足您的需求。
您可以使用它来创建任何类型的网站。要了解更多信息,请参阅我们的文章,了解为什么WordPress是免费的?
虽然WordPress系统是免费的,但您需要域名和虚拟主机才能安装它。
域名是您网站在互联网上的地址。这是您的用户在浏览器的地址栏中键入的内容,以访问您的网站(例如,shelleydigital.com)。
虚拟主机就像您网站的房子,存储了您所有的网站文件。
需要更多托管建议?查看我们挑选的最佳WordPress托管服务提供商。
如果您希望有经验的人来建立您的WordPress网站,那么我们才华横溢的员工很乐意帮助您入门。最好的部分是我们提供免费的WordPress博客设置服务。
您也可以按照我们关于如何安装WordPress的分步指南自己完成。
WordPress 使用主题和插件进行定制
大多数使用WordPress的人既不是网页设计师也不是程序员。事实上,大多数人开始使用WordPress时没有任何设计网站的先验知识。
对于不精通技术的人来说,WordPress 是完美的解决方案,因为您可以选择数千个免费网站模板(称为主题)。
除了免费主题外,您还可以购买具有更多功能和高级支持的廉价付费主题。
每种网站(无论是博客、小型企业网站还是在线商店)都有一个完美的WordPress 主题。
WordPress 主题易于自定义,因为它们中的许多主题都有自己的选项面板。
这使您可以更改颜色,上传logo,更改背景,创建漂亮的布局,并真正根据您的需求对其进行自定义,而无需编写任何代码。
您还可以使用插件向站点添加自定义功能。WordPress 插件就像您网站的应用程序,您可以使用它来添加高级功能,例如 Google 分析、联系表单、会员区等。
就像主题一样,有数以千计的免费和高级插件可供您使用。要了解更多信息,请参阅我们关于什么是WordPress插件及其工作原理的文章。
除了添加额外的功能外,一些WordPress插件还可以让您将网站转变为一种全新的平台。
例如,WooCommerce插件被成千上万的电子商务网站使用,或者MemberPress插件,它允许您销售在线课程。
WordPress是SEO友好的
SEO(搜索引擎优化)可帮助您从Google和Bing等搜索引擎获得免费流量。
根据设计,WordPress开箱即用,对SEO非常友好。它是使用符合标准的高质量代码编写的,可生成语义标记。
在非技术术语中,这使得谷歌和其他搜索引擎喜欢WordPress,这就是为什么WordPress网站在搜索引擎中的排名往往高于其他网站的原因。
此外,您可以使用WordPress SEO插件来进一步优化您的网站。
WordPress易于管理
WordPress带有内置的更新管理系统。这允许您从WordPress管理仪表板中更新插件和主题。
WordPress还会在有新版本的WordPress可用时通知您,因此您只需单击一个按钮即可更新您的网站。
为了保护您的数据免受任何事故或黑客攻击,您可以轻松使用 WordPress 备份插件自动创建备份并将其安全地存储在远程位置。
您还可以使用WordPress移动应用程序随时随地管理您的WordPress网站。
WordPress安全可靠
WordPress的开发考虑了安全性,它被认为是运行网站的非常安全可靠的平台。然而,就像现实世界一样,互联网可能是一个不确定的地方。
WordPress很棒的安全插件可以在您的网站周围添加安全层。只需几个简单的步骤,您就可以使其更加安全。
有关详细信息,请参阅我们面向初学者的分步 WordPress 安全指南。
我们使用 Sucuri 在我们的网站上防止暴力攻击和恶意软件等常见威胁。
WordPress可以处理不同的媒体类型
WordPress不仅限于编写文本。它带有内置的媒体上传器来处理图像、音频和视频文件。
WordPress支持支持Embed的网站。这使您可以轻松地将社交媒体内容嵌入到网站上的任何位置;外贸网站可以将Youtube视频嵌入网页的任何地方。
例如,您可以通过在WordPress帖子编辑器中粘贴URL来嵌入YouTube视频,Instagram照片,推文和Soundcloud音频。这些嵌入中的每一个在内容编辑器中也有唯一的块,并带有该类型嵌入的特定选项。
WordPress可以以许多不同的方式使用。从简单的网站到电子商务市场以及介于两者之间的任何内容。
删除操作和过滤器
有时你想从另一个插件、主题甚至WordPress Core已经注册的钩子中删除回调函数。
要从钩子中删除回调函数,您需要调用 remove_action()或remove_filter() ,具体取决于回调函数是作为 Action 还是 Filter 添加的。
传递给remove_action() / remove_filter()的参数必须与传递给注册它的add_action() /add_filter() 的参数相同,否则删除将不起作用。
警报:若要成功删除回调函数,必须在注册回调函数后执行删除。执行顺序很重要。
例
假设我们想通过删除不必要的功能来提高大型主题的性能。
让我们通过查看来分析主题的functions.php代码。
function wporg_setup_slider() {
// ...
}
add_action( 'template_redirect', 'wporg_setup_slider', 9 );
wporg_setup_slider函数正在添加一个我们不需要的滑块,它可能加载一个巨大的 CSS 文件,然后加载一个 JavaScript 初始化文件,该文件使用大小为 1MB 的自定义编写库。
由于我们想在回调函数wporg_setup_slider注册(functions.php执行)后挂接到WordPress,我们最好的机会是after_setup_theme钩子。
function wporg_disable_slider() {
// Make sure all parameters match the add_action() call exactly.
remove_action( 'template_redirect', 'wporg_setup_slider', 9 );
}
// Make sure we call remove_action() after add_action() has been called.
add_action( 'after_setup_theme', 'wporg_disable_slider' );
删除所有回调
您还可以使用remove_all_actions() /remove_all_filters() 删除与钩子关联的所有回调函数。
确定当前挂钩
有时,您希望在多个钩子上运行操作或过滤器,但根据当前调用它的行为有所不同。
您可以使用 current_action()/current_filter()来确定当前action / filter。
function wporg_modify_content( $content ) {
switch ( current_filter() ) {
case 'the_content':
// Do something.
break;
case 'the_excerpt':
// Do something.
break;
}
return $content;
}
add_filter( 'the_content', 'wporg_modify_content' );
add_filter( 'the_excerpt', 'wporg_modify_content' );
检查钩子运行了多少次
有些钩子在执行过程中被多次调用,但你可能只希望你的回调函数运行一次。
在这种情况下,您可以检查钩子使用 did_action() 运行了多少次。
function wporg_custom() {
// If save_post has been run more than once, skip the rest of the code.
if ( did_action( 'save_post' ) !== 1 ) {
return;
}
// ...
}
add_action( 'save_post', 'wporg_custom' );
使用“all”钩子进行调试
如果您希望在每个钩子上触发回调函数,可以将其注册到all钩子中。有时,这在调试情况下很有用,以帮助确定特定事件发生的时间或页面崩溃的时间。
function wporg_debug() {
echo '<p>' . current_action() . '</p>';
}
add_action( 'all', 'wporg_debug' );
一个重要但经常被忽视的做法是在插件中使用自定义钩子,以便其他开发人员可以扩展和修改它。
自定义钩子的创建和调用方式与WordPress Core钩子相同。
创建钩子
要创建自定义挂钩,对action用do_action,对filter用apply_filters()
注意:我们建议对输出到浏览器的任何文本使用apply_filters()。
这使得插件更容易根据用户的需要进行修改。
命名冲突
当两个开发人员将相同的钩子名称用于完全不同的目的时,就会发生命名冲突。这导致难以找到错误。因此,在钩子名称前面加上唯一的字符串很重要,以避免钩子名称与其他插件发生冲突。
例如,名为email_bodywporg_的过滤器足够通用,以至于两个或多个开发人员可以在不同的插件中将此钩子用于不同的目的。
因此,为了避免这种情况,添加了前缀。
例如,本手册中用作示例的函数用作前缀。当你选择你的前缀时,你可以使用你的公司名称,你的wp句柄,插件名称,任何你喜欢的东西。目标是使其独一无二,因此请明智地选择。
例子
可扩展操作:设置窗体
如果您的插件将设置表单添加到管理面板,您可以使用操作来允许其他插件向其添加自己的设置。
do_action( 'wporg_after_settings_page_html' );
现在另一个插件可以为钩子wporg_after_settings_page_html注册一个回调函数并注入新的设置。
add_action( 'wporg_after_settings_page_html', 'myprefix_add_settings' );
请注意,由于这是一个操作,因此不返回任何值。另请注意,由于未指定优先级,因此它将以默认优先级 10 运行。
可扩展筛选器:自定义帖子类型
在此示例中,注册新的帖子类型时,定义它的参数将通过过滤器传递,因此另一个插件可以在创建帖子类型之前更改它们。
function wporg_create_post_type() {
$post_type_params = [/* ... */];
register_post_type(
'post_type_slug',
apply_filters( 'wporg_post_type_params', $post_type_params )
);
}
现在另一个插件可以为钩子wporg_post_type_params注册一个回调函数并更改帖子类型参数:
function myprefix_change_post_type_params( $post_type_params ) {
$post_type_params['hierarchical'] = true;
return $post_type_params;
}
add_filter( 'wporg_post_type_params', 'myprefix_change_post_type_params' );
请注意,筛选器筛选器获取数据、修改数据并返回数据。因此,名为 myprefix_change_post_type_params( ) 的代码不会使用 echo 或 html 或其他任何内容直接输出到屏幕。另请注意,重新调整的值由register_post_type直接使用,而无需先分配给变量。跳过额外的步骤。
另请注意,由于未指定优先级,因此它将以默认优先级 10 运行。由于预期的参数数量没有值,因此假定默认值为一个。
过滤器是两种类型的钩子之一。
它们为函数提供了一种在执行WordPress Core,插件和主题期间修改数据的方法。它们是action的对应物。
与aciton不同,筛选器旨在以隔离方式工作,并且不应产生副作用,例如影响全局变量和输出。过滤器希望将某些内容返回给它们。
添加过滤器
添加筛选器的过程包括两个步骤。
首先,您需要创建一个 Callback 函数,该函数将在过滤器运行时调用。其次,您需要将 Callback 函数添加到将执行函数调用的钩子中。
您将使用 add_filter() 函数,传递至少两个参数:
- string $hook_name这是您要挂钩的过滤器的名称,以及
- callable $callback回调函数的名称。
下面的示例将在执行筛选器时运行the_title。
function wporg_filter_title( $title ) {
return 'The ' . $title . ' was filtered';
}
add_filter( 'the_title', 'wporg_filter_title' );
假设我们有一个帖子标题“学习WordPress”,上面的例子会将其修改为“学习WordPress被过滤”。
随着你获得更多的经验,浏览WordPress Core源代码将让你找到最合适的钩子。
其他参数
add_filter() 可以接受两个附加参数int $priority,int $accepted_args,用于为回调函数指定的优先级,以及用于将传递给回调函数的参数数。
例
要在满足特定条件时向<body>添加 CSS 类,请执行以下操作:
function wporg_css_body_class( $classes ) {
if ( ! is_admin() ) {
$classes[] = 'wporg-is-awesome';
}
return $classes;
}
add_filter( 'body_class', 'wporg_css_body_class' );
action是两种类型的钩子之一。它们提供了一种在执行WordPress Core,插件和主题的特定点运行函数的方法。Action 的回调函数不会向调用 Action 挂钩返回任何内容。它们是过滤器的对应物。
添加操作
添加操作的过程包括两个步骤:
创建回调函数
首先,创建一个回调函数。此函数将在运行其挂钩到的操作时运行。
回调函数就像普通函数一样:它应该有前缀,并且应该在可调用的地方或某个地方。它应该接受的参数将由你挂接到的操作定义;大多数钩子都定义得很好,因此请查看钩子文档,了解您选择的操作将传递给函数的参数。functions.php
分配(挂钩)回调函数
其次,将回调函数添加到操作中。这称为挂钩,并告知操作在操作运行时运行回调函数。
当回调函数准备就绪时,使用 add_action() 将其挂接到您选择的操作。至少需要两个参数:add_action()
- string $hook_name这是您要挂钩的操作的名称,以及
- callable $callback回调函数的名称。
下面的示例将在执行钩子时运行wporg_callback():init
function wporg_callback() {
// do something
}
add_action( 'init', 'wporg_callback' );
您可以参考 Hooks 一章以获取可用钩子的列表。
随着你获得更多的经验,浏览WordPress Core源代码将让你找到最合适的钩子。
其他参数
add_action()可以接受两个附加参数int$priority, int $accepted_args,用于为回调函数提供的优先级,以及用于将传递给回调函数的参数数。
优先权
许多回调函数可以挂接到单个操作。例如,钩子得到了很多使用。在某些情况下,可能需要确保回调函数在其他回调函数之前或之后运行,即使这些其他函数可能尚未挂钩。
WordPress 根据两件事确定回调函数的运行顺序:第一种方法是手动设置优先级。这是使用第三个参数来完成的。
以下是有关优先级的一些重要事实:
- 优先级为正整数,通常介于 1 和 20 之间
- 默认优先级(即手动提供任何值时分配的优先级)为 10priority
- 优先级值没有理论上的上限,但实际的上限是100
优先级为 11 的函数将在优先级为 10 的函数之后运行;优先级为 9 的函数将在优先级为 10 的函数之前运行。
确定回调函数顺序的第二种方式只是根据它在同一优先级值中的注册顺序。因此,如果为具有相同优先级的同一钩子注册了两个回调函数,则它们将按照它们注册到钩子的顺序运行。
例如,以下回调函数都注册到钩子,
但优先级不同:init
add_action('init', 'wporg_callback_run_me_late', 11);
add_action('init', 'wporg_callback_run_me_normal');
add_action('init', 'wporg_callback_run_me_early', 9);
add_action('init', 'wporg_callback_run_me_later', 11);
在上面的示例中:
- 第一个函数运行将是 ,因为它的手动优先级为 9wporg_callback_run_me_early()
- 接下来wporg_callback_run_me_normal(),因为它没有设置优先级,所以它的优先级是 10,
- 接下来,运行wporg_callback_run_me_late(),因为它的手动优先级为 11
- 最后,是运行wporg_callback_run_me_later():它的优先级也是 11,但它在 wporg_callback_run_me_late()之后.
参数数
有时,回调函数需要接收一些与挂钩到的操作相关的额外数据。
例如,当WordPress保存帖子并运行钩子时,它会将两个参数传递给回调函数:正在保存的帖子的ID,以及帖子对象本身。
do_action( 'save_post', $post->ID, $post );
为挂钩注册回调函数时,它可以指定要接收这两个参数。它通过(在这种情况下)作为第四个参数来告诉期望它们。
add_action('save_post', 'wporg_custom', 10, 2);
为了在回调函数中实际接收这些参数,请修改回调函数将接受的参数,如下所示:
function wporg_custom( $post_id, $post ) {
// do something
}
数据库读取
本节中的筛选器应用于在页面上显示或编辑屏幕上之前从数据库中读取的信息。
应用于编辑附件时要显示的表单域。在get_attachment_fields_to_edit函数中调用。过滤函数参数:表单字段数组,帖子对象。
应用于get_attachment_icon函数中附件的图标。过滤函数参数:图标文件作为HTML IMG标签,附件ID。
应用于要在get_attachment_innerHTML函数中用于附件的标题(如果没有图标)。筛选函数参数:内部 HTML(默认为标题)、附件 ID。
在显示以进行编辑之前应用于帖子作者。
应用于 HTML 元素的类。在函数中调用。Filter 函数参数:类名数组和添加到第一个数组的其他类名数组。<body>get_body_class
应用于在显示以进行编辑之前发布内容。
应用于在显示以进行编辑之前过滤的帖子内容。
应用于在显示进行编辑之前发布摘录。
应用于显示以进行编辑之前的发布日期。
应用于显示以进行编辑之前的发布日期。
应用于 get_attached_file 函数检索的附加文件信息。筛选函数参数:文件信息、附件 ID。
应用于get_enclosed函数的帖子的附件列表。
应用于 get_pages 函数返回的页面列表。过滤函数参数:页面列表(每个项目包含一个页面数据数组),get_pages函数参数列表(告诉请求了哪些页面)。
应用于 get_pung 函数发布的 ping 网址列表。
应用于get_the_archive_title函数中存档的标题。
应用于get_the_excerpt函数中的帖子摘录。
应用于get_the_guid函数中帖子的 GUID。
应用于 URL 列表,以通过 get_to_ping 函数 ping 帖子。
在多个函数中应用于模板的图像目录。基本上允许插件指定MIME类型的图标应来自不同的位置。
应用于模板的多个函数的图像目录 URI。基本上允许插件指定MIME类型的图标应来自不同的位置。
应用于媒体库中可选择的图像大小列表。通常用于使自定义图像大小可选。
在显示以进行编辑之前应用于发布 MIME 类型。
应用于显示编辑之前的发布修改日期。
在显示以进行编辑之前应用于修改后的 GMT 日期。
适用于已注册的短代码。可用于从自动纹理化功能中免除简码。
应用于在显示以进行编辑之前发布父级 ID。
应用于在显示以进行编辑之前发布密码。
应用于帖子最外层 HTML 元素的类。在函数中调用。Filter 函数参数:类名数组、添加到第一个数组的其他类名数组以及后 ID。get_post_class
在KSES处理/消毒之前应用于各种内容。此钩子允许开发人员自定义内容中应允许或剥离的脚本/标签类型。
应用于要以 prepend_attachment 函数为前缀的 HTML。
用于在帖子受密码保护时更改或操作帖子标题。
用于在帖子标题状态为私有时更改或操作帖子标题。
在去除 HTML 标记后,由 sanitize_title 函数应用于帖子标题。
当用于通过wp_title和single_post_title功能创建博客页面标题时应用于文章标题。
在显示以进行编辑之前应用于帖子状态。
应用于在屏幕上打印之前从数据库中检索的帖子内容(也用于其他一些操作,例如引用)。
在包含在 RSS 源中之前应用于帖子内容。(已弃用)
在包含在 RSS 源中之前应用于帖子内容。
应用于在将内容放入富编辑器窗口之前发布内容。
应用于在屏幕上打印之前从数据库中检索的帖子摘录(如果没有摘录,则应用于帖子内容)(也用于某些其他操作,例如引用)。
在包含在 RSS 源中之前应用于帖子摘录。
应用于受保护帖子的密码表单。
应用于在屏幕上打印之前从数据库中检索到的标记。
应用于在屏幕上打印之前从数据库中检索到的帖子标题(也用于其他一些操作,例如引用)。
在包含在 RSS 源之前应用于帖子标题(首次使用 the_title 过滤后。
在显示以进行编辑之前应用于帖子标题。
在显示以进行编辑之前应用于帖子类型。
应用于由wp_dropdown_pages函数生成的WordPress页面的HTML下拉列表。
应用于wp_list_pages函数生成的 HTML 列表。
应用于 wp_list_pages 函数中排除的页面列表(页面 ID 数组)。
应用于wp_get_attachment_metadata函数检索的附件元数据。过滤函数参数:元数据、附件 ID。
应用于wp_get_attachment_thumb_file函数检索的附件缩略图文件。筛选函数参数:缩略图文件、附件 ID。
应用于wp_get_attachment_thumb_URL函数检索的附件缩略图 URL。筛选函数参数:缩略图 URL、附件 ID。
应用于 wp_get_attachment_url 函数检索的附件 URL。筛选函数参数:URL、附件 ID。
应用于由wp_mime_type_icon函数计算的附件的 MIME 类型图标。过滤函数参数:计算的图标 URI、MIME 类型、帖子 ID。
在发送到wp_title功能中的浏览器之前应用于博客页面标题。
数据库写入
本节中的筛选器在保存到数据库之前应用于信息。
在将新信息保存在数据库中之前,在添加 ping 时应用于帖子上 ping 字段的新值。
在将附件保存到数据库中之前应用于与附件关联的字段。在media_upload_form_handler函数中调用。过滤函数参数:帖子属性数组,附件字段数组,包括从表单提交的更改。
在减小图像大小之前应用于最大图像尺寸。筛选器函数输入(和返回值)为 false(如果未指定最大尺寸)或双项目列表(宽度、高度)。
在将列表保存到数据库中之前应用于帖子类别逗号分隔列表(也用于附件)。
应用于将评论保存到数据库之前的状态(也用于附件)。
在将过滤的帖子内容保存到数据库中之前应用于过滤的内容(也用于附件)。
应用于在将内容保存到数据库之前发布内容(也用于附件)。
应用于将摘录保存到数据库中之前将其保存到数据库(也用于附件)。
image_save_pre(已弃用)
jpeg_quality(已弃用)
请改用 wp_editor_set_quality 或 WP_Image_Editor::set_quality()。
name_save_pre(已弃用)
在将帖子保存到数据库中之前应用于帖子名称(也用于附件)。
在保存之前应用于通过电子邮件提交的帖子的内容。
应用于在将 ping 状态保存到数据库中之前将其发布(也用于附件)。
在将附件保存到数据库中之前应用于附件的 MIME 类型。
在将帖子保存到数据库中之前应用于发布状态。
应用于上传图像时缩略图的文件名。
在将帖子标题保存到数据库中之前应用于帖子标题(也用于附件)。
在update_attached_file函数的帖子元数据中保存之前应用于附件信息。筛选函数参数:附件信息、附件 ID。
wp_create_thumbnail(已弃用)wp_delete_file
在删除之前应用于附件文件名。
wp_generate_attachment_metadata
在数据库中保存之前应用于附件元数据数组。
wp_save_image_file(已弃用)
wp_thumbnail_creation_size_limit
应用于上传图像时缩略图的大小。筛选函数参数:最大文件大小、附件 ID、附件文件名。
应用于上传图像时缩略图的大小。过滤函数参数:图像端最大大小、附件 ID、附件文件名。
在wp_update_attachment_metadata函数中保存之前应用于附件元数据。过滤函数参数:元数据、附件 ID。
评论、引用和 ping 过滤器
另请参阅下面的 #Author 和用户过滤器、#Link 过滤器、#Date 和时间过滤器以及 #Administrative 过滤器。
数据库读取
本节中的筛选器应用于在页面上显示或编辑屏幕上之前从数据库中读取的信息。
应用于 comment_excerpt 函数的注释摘录。另请参阅get_comment_excerpt。
当有人似乎用评论淹没您的博客时应用。过滤函数参数:已阻止(true/false,以前的过滤插件是否已阻止它;设置为 true 并返回 true 以阻止插件中的此注释)、上一个注释的时间、当前注释的时间。
应用于有人添加评论后的重定向位置。过滤函数参数:重定向位置、注释信息数组。
在通过comment_text功能显示在屏幕上之前应用于注释文本,并在管理菜单中应用。
在包含在 RSS 源中之前应用于注释文本。
应用于comments_template函数中帖子的评论数组。过滤函数参数:评论信息结构数组,帖子 ID。
应用于格式化文本,提供 comments_number 函数生成的注释数。另请参阅get_comments_number。
应用于由 get_comment_excerpt 函数(也由 comment_excerpt 调用)从数据库中读取的注释摘录。另请参阅comment_excerpt。
应用于 get_comment_ID 函数从全局$comments变量读取的注释 ID。
应用于 get_comment_text 函数中当前注释的注释文本,该函数也由 comment_text 函数调用。
应用于get_comment_type函数(也由comment_type调用)的注释类型(“注释”、“引用”或“pingback”)。
应用于 get_comments_number 函数(也由 comments_number 函数调用;另请参阅comments_number筛选器)从$post全局变量读取的注释计数。
应用于 comments_rss 函数为评论源生成的源 URL。
数据库写入
本节中的筛选器在保存到数据库之前应用于信息。
在更新/编辑评论数据之前应用于评论数据。函数参数:注释数据数组,索引为“comment_post_ID”、“comment_author”、“comment_author_email”、“comment_author_url”、“comment_content”、“comment_type”和“user_ID”。
应用于当前注释的批准状态(真/假)以允许插件覆盖。返回 true/false 并将第一个参数设置为 true/false 以批准/拒绝注释,并使用全局变量(如 $comment_ID)访问有关此注释的信息。
在将注释保存到数据库中之前应用于注释的内容。
在数据库中保存新注释时,在任何其他处理之前应用于注释数据。函数参数:注释数据数组,索引为“comment_post_ID”、“comment_author”、“comment_author_email”、“comment_author_url”、“comment_content”、“comment_type”和“user_ID”。
在更新或将帖子插入数据库之前应用于wp_insert_post()中修改和未修改的帖子数据。函数参数:修改和扩展的帖子数组和经过净化的帖子数组。
类别和术语筛选器
另请参阅下面的 #Administrative 过滤器。
数据库读取
本节中的筛选器应用于在页面上显示或编辑屏幕上之前从数据库中读取的信息。
通过category_description和wp_list_categories功能应用于“描述”字段类别。过滤函数参数:描述、从category_description调用时的类别 ID;描述,从wp_list_categories调用时类别信息数组(该特定类别的类别表中的所有字段)。
应用于由 get_category_feed_link 函数为类别 Feed 生成的源 URL。
应用于由get_category_link函数为类别创建的 URL。筛选函数参数:链接 URL、类别 ID。
应用于 get_ancestors 函数返回的祖先 ID 列表(该函数又由许多其他函数使用)。过滤函数参数:祖先 ID 数组、给定对象 ID、给定对象类型。
应用于由 get_categories 函数生成的类别列表(该函数又由许多其他函数使用)。筛选函数参数:类别列表、get_categories选项列表。
应用于get_category函数查找的类别信息,该信息基本上是WordPress类别表中特定类别ID的所有字段的数组。
呼吁有两个不同的目的:
- wp_dropdown_categories 函数使用它来过滤show_option_all和show_option_none参数(用于在类别下拉列表中放置选项“全部”和“无”)。没有额外的筛选器函数参数。
- wp_list_categories函数将其应用于类别名称。筛选函数参数:类别名称、类别信息列表(该特定类别的类别表中的所有字段)。
应用于 SQL WHERE 语句,该语句提供 get_categories 函数要排除的类别。通常,插件会添加到此列表中,以便从类别列表中排除某些类别或类别组。筛选函数参数:排除类别 WHERE 子句,get_categories选项列表。
当用于通过wp_title和single_cat_title功能创建博客页面标题时应用于类别名称。
应用于由 get_the_category_list 函数创建的类别列表(带有链接的 HTML 列表)。过滤函数参数:生成的HTML文本,正在使用的列表分隔符(空字符串表示它是默认的LI列表),父参数get_the_category_list。
在包含在 RSS 源中之前,通过 get_the_category_rss 函数应用于帖子的类别列表(类别 XML 元素的列表)。过滤器函数参数是列表文本和类型(通常是“rdf”或“rss”)。
应用于由 wp_dropdown_categories 函数生成的下拉类别列表(包含 HTML 选项元素的文本字符串)。
应用于由wp_list_categories函数生成的类别列表(HTML 列表)。
应用于由 wp_get_object_terms 函数生成的术语列表(对象数组),该函数由许多与类别/术语相关的函数(如 get_the_terms 和 get_the_category)调用。
数据库写入
本节中的筛选器在保存到数据库之前应用于信息。
在保存在数据库中之前应用于类别描述。
在应用术语更新之前筛选术语父项,请挂钩到此筛选器以查看它是否会导致层次结构循环。
(实际上是一个动作,但通常像过滤器一样使用)在数据库中保存分类/类别更改之前挂钩
在保存在数据库中之前应用于类别名称。
在保存在数据库中之前应用于类别 nice 名称。
链接过滤器
注意:此部分包含与帖子、页面、档案、提要等链接相关的过滤器。有关博客链接,请参阅下面的 #Blogroll 过滤器部分。
通过get_attachment_link函数应用于计算的附件永久链接。过滤函数参数:链接 URL、附件 ID。
应用于由 get_author_rss_link 函数为作者源生成的源 URL。
应用于由get_author_posts_url函数创建的作者存档永久链接。过滤函数参数:链接 URL、作者 ID、作者的“漂亮”名称。请注意,get_author_posts_url是在函数wp_list_authors和the_author_posts_link中调用的。
应用于由函数 comments_template 中调用的 get_comment_reply_link 函数为回复特定注释而生成的链接。过滤函数参数:链接(字符串)、自定义选项(数组)、当前评论(对象)、当前帖子(对象)。
通过get_day_link函数应用于每日存档的链接 URL。过滤函数参数:URL、年、月、日数。
通过get_feed_link函数应用于源的链接 URL。过滤函数参数:URL、源类型(例如“rss2”、“atom”等)。
应用于在 get_comment_author_link 函数(也由 comment_author_link 调用)中为作者在评论上的链接生成的 HTML。操作函数参数:用户名
应用于在 get_comment_author_url_link 函数(也由 comment_author_link 调用)中为评论上的作者链接生成的 HTML。
通过get_month_link函数应用于每月存档的链接 URL。过滤函数参数:URL、年、月数。
通过 get_page_link 函数应用于计算的页面 URL。过滤函数参数:URL、页面 ID。 请注意,还有一个名为 _get_page_link 的内部过滤器,可用于过滤未指定为博客主页的页面的 URL(相同的参数)。请注意,这仅适用于WordPress页面,不适用于帖子,自定义帖子类型或附件。
由 get_permalink 函数应用于计算后的永久链接,该函数也由 the_permalink、post_permalink、previous_post_link 和 next_post_link 函数调用。过滤函数参数:永久链接URL,发布数据列表。请注意,这仅适用于WordPress默认帖子,不适用于自定义帖子类型(页面或附件)。
通过get_post_permalink函数应用于计算的自定义帖子类型永久链接。
应用于在按函数the_permalink打印之前帖子的永久链接 URL。
通过get_year_link函数应用于年度存档的链接 URL。筛选函数参数:URL、年份。
应用于 get_tag_link 函数为标记创建的 URL。过滤函数参数:链接网址、标签 ID。
应用于由get_term_link函数为术语创建的 URL。筛选函数参数:术语链接 URL、术语对象和分类 slug。
日期和时间筛选器
另请参阅上面的 #Link 过滤器。
应用于由 get_comment_date 函数(也称为comment_date)生成的格式化注释日期。
应用于 get_comment_time 函数(也由 comment_time 调用)中的格式化注释时间。
应用于由 get_the_modified_date 函数(也由 the_modified_date 函数调用)生成的格式化修改后日期。
应用于由get_the_modified_time和get_post_modified_time函数(也由the_modified_time函数调用)生成的格式化后修改时间。
应用于由get_the_time和get_post_time函数(也由the_time函数调用)生成的格式化开机自检时间。
应用于the_date函数生成的格式化发布日期。
应用于the_modified_date函数生成的格式化后修改日期。
应用于the_modified_time函数生成的格式化后修改时间。
应用于the_time功能生成的格式化开机自检时间。
应用于 the_weekday 函数生成的发布日期工作日名称。
应用于 the_weekday_date 函数生成的发布日期工作日名称。函数参数是工作日名称、文本之前和文本之后(如果当前帖子的工作日与上一篇文章的工作日不同,则文本之前和文本之后将添加到工作日名称中)。
作者和用户筛选器
另请参阅 #Link 筛选器和 #Administrative 筛选器部分。
允许过滤应用于 login_header() 中登录屏幕的 body 类。
在用户登录过程中应用于 redirect_to POST/GET 变量。
应用于“用户配置文件”页上的“联系方式”字段。(旧页面在这里:联系方式)
在更新(用户)元数据之前应用。
数据库读取
本节中的筛选器应用于在页面上显示或编辑屏幕上之前从数据库中读取的信息。
应用于由comment_author_email函数从数据库中检索的评论作者的电子邮件地址。另请参阅get_comment_author_email。
应用于由 comment_author 函数从数据库中检索的注释作者姓名。另请参阅get_comment_author。
在包含在 RSS 源中之前应用于评论作者的姓名。
应用于通过 comment_author_email_link 函数从数据库中检索的评论作者的电子邮件地址。
应用于由 comment_author_url 函数从数据库中检索的注释作者的 URL(另请参阅get_comment_author_url)。
应用于由get_comment_author从数据库中检索到的注释作者姓名,comment_author也称为该名称。另请参阅comment_author。
应用于get_comment_author_email从数据库中检索到的评论作者的电子邮件地址,comment_author_email也调用该地址。另请参阅author_email。
应用于由 get_comment_author_IP 函数从数据库中检索的注释作者的 IP 地址,该函数也由 comment_author_IP 调用。
应用于由 get_comment_author_url 函数(也由 comment_author_url 调用)从数据库中检索的注释作者的 URL。另请参阅comment_url。
应用于登录屏幕上打印的登录错误消息。
应用于登录屏幕上打印的登录标头 URL(默认由 WordPress 提供支持)的标题。
应用于登录屏幕上打印的登录标头 URL(默认指向 wordpress.org)。
应用于登录屏幕上打印的登录消息。
应用于 WP_Role->has_cap 函数中角色的功能列表。筛选函数参数是要筛选的功能列表、被质疑的功能以及角色的名称。
通过 sanitize_user 函数应用于用户名。过滤函数参数:用户名(经过一些清理),原始用户名,严格(真或假使用严格的ASCII或不)。
由 get_the_author 函数应用于帖子作者的显示姓名,该函数也由 the_author 函数调用。
通过the_author_email功能应用于帖子作者的电子邮件地址。
应用于wp_users表中要包含在 WHERE 子句中的列列表WP_User_Query。
数据库写入
本节中的筛选器在保存到数据库之前应用于信息。
在将评论保存到数据库中之前应用于评论作者的电子邮件地址。
应用于注释作者在数据库中保存注释之前的用户名。
在将评论保存到数据库中之前应用于注释作者的 URL。
在将注释保存到数据库中之前应用于注释作者的用户代理。
在将评论保存到数据库中之前应用于评论作者的 IP 地址。
在将注释保存到数据库中之前应用于注释作者的用户 ID。
在数据库中保存之前应用于用户的说明。
在数据库中保存之前应用于用户的显示名称。
在保存在数据库中之前应用于用户的电子邮件地址。
在数据库中保存之前应用于用户的名字。
在数据库中保存之前应用于用户的姓氏。
在数据库中保存之前应用于用户的登录名。
在保存到数据库中之前应用于用户的“好名称”。
在数据库中保存之前应用于用户的昵称。
在保存在数据库中之前应用于用户的 URL。
应用于为新帐户注册用户时生成的注册错误列表。
应用于在尝试将用户注册为新用户之前从注册页面读取的用户电子邮件地址。
应用于新用户名的验证结果。筛选函数参数:有效(真/假),用户名正在验证。
博客过滤器
注意:此部分包含与博客链接相关的过滤器。有关与帖子、页面、类别等链接相关的过滤器,请参阅上面的 #Link 过滤器部分。
通过get_bookmarks函数应用于链接/博客数据库查询结果。筛选函数参数:数据库查询结果列表、get_bookmarks参数列表。
通过get_links_list和wp_list_bookmarks功能应用于链接类别(从WordPress 2.2开始)。
应用于get_links和wp_list_bookmarks函数的链接描述(从WordPress 2.2开始)。
通过get_linkrating函数应用于链路评级号。
通过get_links和wp_list_bookmarks功能应用于链接标题(从WordPress 2.2开始)
在保存在数据库中之前应用于链接说明。
在保存在数据库中之前应用于链接图像。
在保存在数据库中之前应用于链接名称。
在保存在数据库中之前应用于链接注释。
在保存在数据库中之前应用于链接关系信息。
在保存在数据库中之前应用于链接 RSS URL。
在保存在数据库中之前应用于链接目标信息。
在保存在数据库中之前应用于链接 URL。
博客信息和选项过滤器
应用于由 get_alloptions 函数从数据库中检索的选项列表。
应用于检索到以显示在插件列表表中的插件列表。
应用于博客选项,在首先使用 get_bloginfo 函数检索信息后,由 Bloginfo 函数从数据库中检索的信息。第二个参数$show给出所请求的 bloginfo 选项的名称。请注意,bloginfo(“url”)、bloginfo(“directory”)和bloginfo(“home”)不使用此过滤功能(请参阅bloginfo_url)。
首先使用 get_bloginfo 函数检索信息、去除 HTML 标记并适当转换字符后,按函数 get_bloginfo_rss(也称为从 bloginfo_rss 调用)应用于博客选项信息。第二个参数$show给出所请求的 bloginfo 选项的名称。
在返回信息之前应用于 bloginfo(“url”)、bloginfo(“directory”) 和 bloginfo(“home”) 的输出。
应用于wp_loginout功能生成的用于登录和注销的HTML链接(通常放置在侧边栏中)。
应用于允许用户重置其密码的 URL。
应用于反序列化后由 get_option 函数从数据库中检索的选项值(解码基于数组的选项)。要使用此过滤器,您需要为特定选项名称添加过滤器,例如“option_foo”以过滤 get_option(“foo”) 的输出。
应用于 get_space_used() 函数,以提供显示已用存储空间的替代方法。从此筛选器返回 false 将恢复为默认显示行为(以兆字节为单位使用 wp_upload_dir() 目录空间)。
应用于 get_alloptions 函数在反序列化后从数据库中检索的选项值(解码基于数组的选项)。要使用此过滤器,您需要为特定选项名称添加过滤器,例如“pre_option_foo”以过滤选项“foo”。
在保存到数据库之前应用了选项值,以允许覆盖要存储的值。要使用此过滤器,您需要为特定选项名称添加过滤器,例如“pre_update_option_foo”以过滤选项“foo”。
应用于为用户创建的侧边栏链接,以通过wp_register功能注册(如果允许)或访问管理面板(如果已登录)。
应用于用于wp_upload_dir函数计算的上载的目录。Filter 函数参数是一个包含组件“dir”(上传目录路径)、“url”(上传目录的 URL)和“error”(如果要生成错误,可以设置为 true)的数组。
允许过滤器函数返回上传的 MIME 类型列表列表(如果 wp_check_filetype 函数没有 MIME 列表输入)。筛选器函数参数是 MIME 类型的关联列表,其组件名称为文件扩展名(用竖线分隔),值为相应的 MIME 类型。
常规文本筛选器
通过attribute_escape函数应用于发布文本和其他内容,在WordPress的许多地方调用该函数,用于在发送到浏览器之前将某些字符更改为HTML属性。
在js_escape函数中发送到浏览器之前应用于 JavaScript 代码。
在将键用于您的设置、字段或其他需求之前应用于 sanitize_key 函数生成的键
管理筛选器
本节中的过滤器与WordPress的管理屏幕相关,包括内容编辑屏幕。
应用于WordPress管理快速菜单中的用户配置文件和信息链接。
应用于自动保存帖子的间隔。
应用于管理员批量操作下拉列表中的批量项目数组。
应用于批量操作更新消息的数组。
应用于为管理菜单中的类别而生成的类别行 HTML。
应用于在编辑屏幕中显示的评论内容。
应用于有人在管理菜单中编辑评论后的重定向位置。筛选函数参数:重定向位置、注释 ID。
在发送电子邮件通知管理员需要审核新评论之前应用于邮件主题。过滤函数参数:邮件主题、注释 ID。 请注意,这发生在默认的 wp_notify_moderator 函数中,这是一个“可插入”函数,这意味着插件可以覆盖它;请参阅插件 API)。
在发送电子邮件通知管理员需要审核新评论之前应用于邮件正文。过滤函数参数:邮件正文文本、注释 ID。 请注意,这发生在默认的 wp_notify_moderator 函数中,这是一个“可插入”函数,这意味着插件可以覆盖它;请参阅插件 API)。
在发送电子邮件通知帖子作者新评论之前应用于邮件标题。过滤函数参数:邮件标题文本、注释 ID。 请注意,这发生在默认的 wp_notify_postauthor 函数中,这是一个“可插入”函数,这意味着插件可以覆盖它;请参阅插件 API)。
在发送电子邮件通知帖子作者新评论之前应用于邮件主题。过滤函数参数:邮件主题、评论 ID。 请注意,这发生在默认的 wp_notify_postauthor 函数中,这是一个“可插入”函数,这意味着插件可以覆盖它;请参阅插件 API)。
在发送电子邮件通知帖子作者新评论之前应用于邮件的正文。过滤函数参数:邮件正文文本、注释 ID。 请注意,这发生在默认的 wp_notify_postauthor 函数中,这是一个“可插入”函数,这意味着插件可以覆盖它;请参阅插件 API)。
应用于每个注释行下的操作链接列表(如“答复”、“快速编辑”、“编辑”)。
允许过滤在 spawn_cron() 中传递给 wp_remote_post() 的 URL、键和参数。
应用于空数组以允许插件在wp_get_schedules函数中生成 cron 计划。
用于激活“menu_order”过滤器。
在为新帖子打开编辑器之前应用于默认帖子内容。
应用于在打开编辑器以获取新帖子之前的默认帖子摘录。
应用于在为新帖子打开编辑器之前的默认帖子标题。
通过get_sample_permalink功能应用于帖子、页面、标签或类别辅助信息域。
通过 format_to_edit 函数应用于帖子内容、摘录、标题和密码,该函数由管理菜单调用以设置帖子进行编辑。也适用于在管理菜单中编辑注释时。
通过format_to_post功能应用于发布内容,默认情况下在WordPress中不使用。
manage_edit-${post_type}_columns
应用于自定义帖子类型的[帖子管理]屏幕上要打印的列列表。筛选器函数参数/返回值是一个关联数组,其中元素键是列的名称,值是该列的标题文本。另请参阅操作 manage_${post_type}_posts_custom_column,它将列信息放入编辑屏幕。
一直manage_link_columns到WordPress 2.7。应用于要在博客滚动管理屏幕上打印的列列表。筛选器函数参数/返回值是一个关联列表,其中元素键是列的名称,值是该列的标题文本。另请参阅操作manage_link_custom_column,它将列信息放入编辑屏幕。
应用于要在帖子管理屏幕上打印的列列表。筛选器函数参数/返回值是一个关联数组,其中元素键是列的名称,值是该列的标题文本。另请参阅操作manage_posts_custom_column,它将列信息放入编辑屏幕。(有关示例和使用,请参阅 Scompt 的教程。
应用于要在“页面管理”屏幕上打印的列列表。筛选器函数参数/返回值是一个关联数组,其中元素键是列的名称,值是该列的标题文本。另请参阅操作manage_pages_custom_column,它将列信息放入编辑屏幕。
manage_users_columnsmanage_users_custom_columnmanage_users_sortable_columnsmedia_row_actions
应用于媒体库中每个文件(如“查看”、“编辑”)下的操作链接列表。
应用于管理菜单顺序的阵列。必须先使用“custom_menu_order”过滤器激活。
应用于随机数的寿命以生成或验证随机数。可用于生成较早过期的随机数。筛选器返回的值应以秒为单位。
应用于用于在用户注销时生成或验证随机数的当前用户 ID。
在插件页面上的每个插件下方添加其他链接。
应用于“编辑后”屏幕上显示的元后信息项目的数量。
应用于“帖子>所有帖子”部分中每个帖子下的操作链接列表(如快速编辑、编辑、查看、预览)。
应用于在处理帖子、页面和自定义帖子类型时存储用户可见的管理消息的数组。此过滤器用于更改所述消息的文本,而不是触发它们。请参阅register_post_type文档中的“自定义消息”。
应用于允许插件创建用于上传文件的 XMLRPC 错误。
应用于页面编辑屏幕上的链接,该链接在屏幕底部显示页面预览。
应用于在屏幕底部显示帖子预览的“后期编辑”屏幕上的链接。
在富文本编辑器中显示之前,通过wp_richedit_pre功能应用于发布内容。
应用于添加到 cron 计划中的每个重复事件和单个事件。
在设置屏幕选项值之前对其进行筛选。
应用于 true/false 变量,该变量控制用户是否有机会在用户配置文件屏幕上更改其密码(true 表示显示密码更改字段;false 表示不显示)。
应用于术语的CSV(针对每个分类法),用于显示哪些术语附加到帖子。
应用于为容纳富文本编辑器而创建的 HTML DIV,然后再将其打印到屏幕上。过滤器函数参数/返回值是一个字符串。
应用于计算用户的浏览器是否具有丰富的编辑功能,以及用户是否要使用丰富的编辑器,在user_can_richedit函数中。如果当前用户可以使用/无法使用富编辑器,则筛选器函数参数和返回值为 true/false。
应用于 WP_User->has_cap 函数(由 current_user_can 函数调用)中的用户功能列表。过滤器函数参数是要过滤的功能列表、被质疑的功能和参数列表(如果功能是编辑帖子等,则包含帖子 ID 等内容)
应用于上传文件时的上传信息。过滤器函数参数:表示 $_FILES 的单个元素的数组。
应用于上传文件时的上传信息。过滤器函数参数:带有元素“文件”(文件名)、“url”、“类型”的数组。
更改给定帖子保留的修订数。过滤函数参数:表示保存的所需修订(默认为无限修订)的数字,发布对象。
应用于 wp_terms_checklist() 函数的参数。过滤器函数参数:清单参数数组,帖子 ID。
应用于要在上载管理管理屏幕上显示的自定义选项卡列表。使用操作upload_files_(选项卡)显示自定义选项卡的页面(请参阅插件 API/操作参考)。
应用于要在上载管理管理屏幕上显示的自定义选项卡列表。使用操作upload_files_(选项卡)显示自定义选项卡的页面(请参阅插件 API/操作参考)。
应用于要在插件页面上显示的链接列表(在激活/停用链接旁边)。
应用于列表帖子,例如 全部 (30) |出版 (22) |草稿 (5) |待定 (2) |垃圾桶 (1)
富文本编辑器筛选器
这些过滤器修改富文本编辑器 TinyMCE 的配置。
应用于拼写检查器中可用的语言选择。
mce_buttons、mce_buttons_2、mce_buttons_3 mce_buttons_4
应用于丰富编辑器工具栏的按钮行(每个按钮都是一个按钮名称数组)。
应用于富文本编辑器的 CSS 文件 URL。
应用于要由富文本编辑器加载的外部插件数组。
应用于外部插件加载的语言文件数组,允许它们使用标准翻译方法(参考参见 Tinymce/langs/WP-LANGS.php)。
应用于编辑器的整个 init 数组。
模板过滤器
本节包含与主题、模板和样式文件相关的链接。
应用于 get_locale_stylesheet_uri 函数返回的区域设置特定的样式表 URI。过滤函数参数:URI、样式表目录 URI。
应用于 get_stylesheet 函数返回的样式表。
应用于 get_stylesheet_directory 函数返回的样式表目录。过滤函数参数:样式表目录、样式表。
应用于 get_stylesheet_directory_uri 函数返回的样式表目录 URI。过滤函数参数:样式表目录 URI、样式表。
应用于 get_stylesheet_uri 函数返回的样式表 URI。过滤函数参数:样式表 URI、样式表。
应用于 get_template 函数返回的模板。
应用于 get_template_directory 函数返回的模板目录。过滤函数参数:模板目录、模板。
应用于 get_template_directory_uri 函数返回的模板目录 URI。筛选函数参数:模板目录URI,模板。
应用于get_theme_root函数返回的主题根目录(通常是WP-content/themes)。
应用于 get_theme_root_uri 函数返回的主题根目录 URI。筛选函数参数:URI、站点 URL。
您还可以使用以下筛选器挂钩替换主题中的单个模板文件。另请参阅template_redirect动作钩子。这些过滤器中的每一个都将当前主题中相应模板文件的路径作为输入。插件可以通过返回模板文件的新路径来修改要使用的文件。
例如,您可以使用它为自定义帖子类型存档强制执行特定模板。这样,您可以将所有代码保存在插件中。
attachment_template author_template category_template comments_popup_template comments_template
“comments_template”过滤器可用于从插件加载自定义模板,以替换主题默认评论模板。
date_template home_template page_template paged_template search_template single_template
例如,您可以使用它为自定义帖子类型强制执行特定模板。这样,您可以将所有代码保存在插件中。
应用于“按此”书签链接。
template_include wp_nav_menu_args
应用于wp_nav_menu函数的参数。
筛选导航菜单的 HTML 列表内容。
库布里克滤波器
这些过滤器存在于 3.0 之前的默认主题 kubrick 中。
应用于库布里克主题标题的颜色。
应用于库布里克主题标题的显示选项。
应用于库布里克主题的标题图像文件。
注册和登录过滤器
允许在登录时根据用户名和密码执行基本身份验证。
应用于为新帐户注册用户时生成的注册错误列表。
应用于在尝试将用户注册为新用户之前从注册页面读取的用户电子邮件地址。
应用于新用户名的验证结果。筛选函数参数:有效(真/假),用户名正在验证。
当用户尝试登录时应用,在 WordPress 验证用户名和密码之后,但在检查验证错误之前。
重定向/重写过滤器
这些高级过滤器与WordPress对重写规则的处理有关。
应用于被认为可以安全重定向的主机名列表。WP-login.php使用它来防御危险的“redirect_to”请求参数
在生成与作者相关的重写规则后应用于这些规则。
在生成与类别相关的重写规则后应用于这些规则。
在生成与注释相关的重写规则后应用于这些规则。
在生成与日期相关的重写规则后应用于这些规则。
应用于当用户更改其永久链接结构时提供给用户的重写规则列表,以放入其 .htaccess 文件中。(注意:替换已弃用的筛选器rewrite_rules。
在生成与页面相关的重写规则后应用于这些规则。
在生成后相关重写规则后应用于这些规则。
可用于取消“规范”网址重定向。接受 2 个参数:$redirect_url、$requested_url。取消重定向返回 FALSE,以允许重定向返回 $redirect_url
在生成后应用于整个重写规则数组。
在生成根级重写规则后应用于这些规则。
在生成与搜索相关的重写规则后应用于这些规则。
通过默认wp_redirect函数应用于重定向 URL。筛选函数参数:URL、HTTP 状态代码。请注意,wp_redirect也是一个“可插拔”函数,这意味着插件可以覆盖它;请参阅插件 API)。
在通过默认wp_redirect函数重定向时应用于 HTTP 状态代码。筛选函数参数:HTTP 状态代码、URL。请注意,wp_redirect也是一个“可插拔”函数,这意味着插件可以覆盖它;请参阅插件 API)。
WP_Query过滤器
这些是 WP_Query 对象在构建和执行查询以检索帖子的过程中运行的过滤器。另请参阅 #Advanced WordPress 过滤器,了解与用户、元值和更通用的查询相关的查询。
应用于帖子列表,就在从数据库查询之后。
从数据库中查询要显示的帖子列表后,WordPress 会在查询结果中选择行。此过滤器允许您在该步骤中执行 SELECT FOUND_ROWS() 以外的操作。
应用于返回 post 数组的查询的 LIMIT 子句。
应用于整个 SQL 查询,分为每个子句类型的键控数组,返回 post 数组。可能比posts_request更容易使用。
允许插件将 DISTINCTROW 子句添加到返回 post 数组的查询中。
应用于返回 POST 数组的查询的字段列表。
应用于返回 post 数组(通常为空)的查询的 GROUP BY 子句。
应用于返回 post 数组的查询的 JOIN 子句。这通常用于将表与posts_where筛选器结合使用,添加到 JOIN。
在计算分页后应用于返回 post 数组的查询的 JOIN 子句(尽管分页不会影响 JOIN,因此这实际上等效于 posts_join)。
应用于返回 post 数组的查询的 ORDER BY 子句。
应用于在运行查询之前返回 post 数组的整个 SQL 查询。
允许您操作从查询返回的结果数组。
应用于 WP_Query 的 WHERE 子句中使用的搜索 SQL。
应用于返回 post 数组的查询的 WHERE 子句。
应用于在计算分页后返回 post 数组的查询的 WHERE 子句(尽管分页不会影响 WHERE,因此这实际上等同于 posts_where)。
应用于在对单帖子页面上的权限和草稿状态进行最小处理后从数据库中查询的帖子列表。
媒体过滤器
本节包含用于集成不同类型的媒体的媒体筛选器。
editor_max_image_size image_downsize get_image_tag_class get_image_tag image_resize_dimensions intermediate_image_sizes icon_dir wp_get_attachment_image_attributes img_caption_shortcode post_gallery use_default_gallery_style gallery_style (相邻)_image_link embed_defaults load_default_embeds embed_oembed_html embed_googlevideo oembed_result upload_size_limit wp_image_editors plupload_default_settings plupload_default_params image_size_names_choose wp_prepare_attachment_for_js media_upload_tabs disable_captions media_view_settings media_view_strings wp_handle_upload_prefilter
高级WordPress过滤器
本节包含与国际化、杂项查询和其他基本 WordPress 功能相关的高级过滤器。
应用于用于在运行查询之前将新用户的信息保存到数据库的查询。
应用于当前用户有权在get_editable_authors功能中编辑的帖子作者列表。
在函数get_next_post(在当前显示的帖子之后查找帖子)中,应用于 SQL JOIN 子句(如果用户正在查看类别存档,该子句通常会连接到类别表)。过滤函数参数:JOIN 子句、保持在同一类别中(真/假)、排除的类别列表。
在函数 get_next_post(在当前显示的帖子之后查找帖子)中,应用于 SQL ORDER BY 子句(通常按发布日期升序排序,限制为 1 个帖子)。筛选函数参数:ORDER BY 子句。
在函数 get_next_post(在当前显示的帖子之后查找帖子)中,应用于 SQL WHERE 子句(通常查找下一个日期发布的帖子)。过滤函数参数:WHERE 子句、保持在同一类别中(真/假)、排除类别列表。
在函数 get_previous_post(在当前显示的帖子之前查找帖子)中,应用于 SQL JOIN 子句(如果用户正在查看类别存档,该子句通常会连接到类别表)。过滤函数参数:联接子句、保持在同一类别(真/假)、排除类别列表。
在函数 get_previous_post(查找当前显示的帖子之前的帖子)中,应用于 SQL ORDER BY 子句(通常按发布日期降序排序,限制为 1 个帖子)。筛选函数参数:ORDER BY 子句。
在函数 get_previous_post(查找当前显示的帖子之前的帖子)中,应用于 SQL WHERE 子句(通常查找上一个日期的已发布帖子)。过滤函数参数:WHERE 子句、保持在同一类别中(真/假)、排除类别列表。
由 translation() 函数应用于翻译文本(由 __() 和 _e() 国际化函数等函数调用)。过滤函数参数:已翻译文本、未翻译文本和文本域。即使国际化无效或文本域尚未加载,也应用。
override_load_textdomainget_meta_sql
在函数 WP_Meta_Query::get_sql(生成要附加到高级元查询的主查询的 SQL 子句)中,应用于高级元查询生成的 SQL JOIN 和 WHERE 子句。过滤器函数参数: array( compact( 'join', 'where' ), $this->query, $type, $primary_table, $primary_id_column, $context )
应用于选择其他用户的草稿以显示在管理菜单中的查询。
应用于选择要在管理菜单中显示的用户草稿的查询。
由 get_locale 函数应用于区域设置。
应用于所有查询(至少所有查询在加载插件后运行)。
已弃用 - 改用query_vars或请求。
在形成 SQL 查询之前应用于公共 WordPress 查询变量列表。对于删除插件以其他方式处理的额外永久链接信息很有用。
与query_vars类似,但在添加“额外”和私有查询变量后应用。
定义单帖子摘录的长度。
定义摘录末尾的更多字符串。
允许您在默认帖子/页面编辑器中将代码附加到表单标记。
应用于用于在运行查询之前更新用户信息的更新查询。
uploading_iframe_src(自WP 2.5起删除)
应用于在帖子和页面编辑屏幕上上传 iframe 的 HTML src 标记。
应用于为 XMLRPC 服务器定义的 XMLRPC 方法列表。
在 wp_mail 函数发送任何邮件之前应用。提供的值是从当前主机名(由 $_SERVER['SERVER_NAME'] 设置)的 wordpress 地址计算得出的。过滤器应以“user@example.com”或“名称<user@example.com>”的形式返回电子邮件地址或名称/电子邮件组合(不带引号!
在 wp_mail 函数发送任何邮件之前应用。筛选器应返回要用作电子邮件发件人名称的名称字符串。
在元数据更新之前应用。例如,如果用户元数据得到更新,则钩子将为“update_user_metadata”
部件
本节包含WordPress核心中存在的小部件添加的过滤器。
应用于传递给 WordPress 小部件中 widgets_init 函数的参数。
应用于传递给 WordPress Archives 小部件中 wp_get_archives() 函数的参数。
应用于传递给 WordPress 类别小部件中 wp_list_categories() 函数的参数。
应用于传递给 WordPress 链接小部件中 wp_list_bookmarks() 函数的参数。
应用于传递给 WordPress 自定义菜单小部件中 wp_nav_menu() 函数的参数。
应用于传递给 WordPress 页面小部件中 wp_list_pages() 函数的参数。
应用于传递给 WordPress 页面小部件中 wp_tag_cloud() 函数的参数。
应用于WordPress文本小部件的小部件文本。也可能适用于某些第三方小部件。
应用于任何用户可编辑的WordPress小部件的小部件标题。也可能适用于某些第三方小部件。
管理员栏
本节包含由WordPress 3.1.0中添加的管理栏添加的过滤器。
允许更改 中 _wp_admin_bar_init() 函数中的默认“WP_Admin_Bar”类。wp-includes/admin-bar.php
action和filter之间的主要区别可以总结如下:
- action获取它收到的信息,对其执行某些操作,并且不返回任何内容。换句话说:它作用于某物,然后退出,不返回任何内容返回调用钩子。
- filter获取它收到的信息,以某种方式修改它,然后返回它。换句话说:它过滤一些东西并将其传递回钩子以供进一步使用。
换一种说法:
- action中断代码流以执行某些操作,然后返回到正常流而不进行任何修改。
- filter用于以特定方式修改某些内容,以便代码稍后使用该修改。
随机数是“使用一次的数字”,用于帮助保护 URL 和表单免受某些类型的滥用、恶意或其他形式的滥用。
从技术上讲,WordPress随机数并不是严格的数字;它们是由数字和字母组成的哈希值。它们也只使用一次:它们的“生命周期”有限,之后它们会过期。在该时间段内,将在给定上下文中为给定用户生成相同的随机数。该操作的随机数将保持不变,直到该随机数生命周期完成。
WordPress的安全令牌被称为“nonces”(尽管与真正的nonces存在上述差异),因为它们与nonces具有大致相同的目的。它们有助于防止多种类型的攻击,包括 CSRF,但不能防止重放攻击,因为它们没有被检查为一次性使用。绝不应依赖随机数进行身份验证、授权或访问控制。使用 保护函数,并始终假设随机数可能会受到损害。current_user_can()
为什么要使用随机数?
有关为什么使用随机数的示例,请考虑管理屏幕可能会生成这样的 URL,该 URL 会丢弃第 123 号帖子。
http://example.com/wp-admin/post.php?post=123&action=trash
当您访问该URL时,WordPress将验证您的身份验证cookie信息,如果您被允许删除该帖子,将继续删除它。攻击者可以做的是让您的浏览器在您不知情的情况下转到该 URL。例如,攻击者可以在第三方页面上制作伪装链接,如下所示:
<img src="http://example.com/wp-admin/post.php?post=123&action=trash" />
这将触发您的浏览器向WordPress发出请求,浏览器将自动附加您的身份验证cookie,WordPress会将其视为有效请求。
添加随机数可以防止这种情况。例如,当使用随机数时,WordPress为用户生成的URL如下所示:
http://example.com/wp-admin/post.php?post=123&action=trash&_wpnonce=b192fc4204
如果有人试图在没有WordPress生成并提供给用户的正确随机数的情况下丢弃123号帖子,WordPress将向浏览器发送“403禁止”响应。
创建随机数
您可以创建一个随机数并将其添加到 URL 中的查询字符串中,可以将其添加到表单的隐藏字段中,也可以以其他方式使用它。
对于要在 AJAX 请求中使用的随机数,通常将随机数添加到隐藏字段中,JavaScript 代码可以从中获取它。
请注意,随机数对于当前用户的会话是唯一的,因此如果用户异步登录或注销,页面上的任何随机数将不再有效。
为访客(非登录用户)自定义随机数
默认情况下,WordPress核心为来宾生成相同的随机数,因为它们具有相同的用户ID(值)。也就是说,它不会阻止客人受到 CSRF 攻击。要增强关键操作的安全性方面,您可以为来宾开发会话机制,并挂接到nonce_user_logged_out过滤器,以便将用户 ID 值替换为会话机制中的另一个随机 ID。00
向 URL 添加随机数
若要将随机数添加到 URL,请调用wp_nonce_url()指定裸 URL 和表示操作的字符串。
$complete_url = wp_nonce_url( $bare_url, 'trash-post_'.$post->ID );
为了获得最大的保护,请确保表示操作的字符串尽可能具体。
默认情况下, wp_nonce_url()会添加一个名为 _wpnonce的字段。您可以在函数调用中指定其他名称。
$complete_url = wp_nonce_url( $bare_url, 'trash-post_'.$post->ID, 'my_nonce' );
向窗体添加随机数
若要向窗体添加随机数,请调用指定表示操作的字符串。默认情况下,会生成两个隐藏字段,一个字段的值为 nonce,另一个字段的值为当前 URL(引荐来源网址),并回显结果。
wp_nonce_field( 'delete-comment_'.$comment_id );
可能会回显如下内容:
<input type="hidden" id="_wpnonce" name="_wpnonce" value="796c7766b1" />
<input type="hidden" name="_wp_http_referer" value="/wp-admin/edit-comments.php" />
为了获得最大的保护,请确保表示操作的字符串尽可能具体。
您可以为 nonce 字段指定不同的名称,可以指定不需要反向链接字段,也可以指定希望返回结果而不回显。
创建以其他方式使用的随机数
若要创建以其他方式使用的随机数,请调用指定表示操作的字符串。例如:wp_create_nonce()
$nonce = wp_create_nonce( 'my-action_'.$post->ID );
这只返回随机数本身。例如:295a686963
为了获得最大的保护,请确保表示操作的字符串尽可能具体。
验证随机数
您可以验证在 URL、管理屏幕中的表单、AJAX 请求或其他上下文中传递的随机数。
验证从管理屏幕传递的随机数 若要验证在管理屏幕
中的 URL 或表单中传递的随机数,请调用check_admin_referer()指定表示操作的字符串。
例如:
check_admin_referer( 'delete-comment_'.$comment_id );
此调用检查随机数和引用,如果检查失败,它将执行正常操作(终止脚本执行并显示“403 禁止”响应和错误消息)。
如果在创建随机数时未使用默认字段名称 (),请指定字段名称。_wpnonce
例如:
check_admin_referer( 'delete-comment_'.$comment_id, 'my_nonce' );
验证在 AJAX 请求中传递的随机数
要验证在 AJAX 请求中传递的随机数,请调用 check_ajax_referer() 指定表示操作的字符串。例如:
check_ajax_referer( 'process-comment' );
此调用检查随机数(但不检查引用),如果检查失败,则默认情况下它会终止脚本执行。
如果在创建随机数时未使用默认字段名称(_wpnonce 或 _ajax_nonce)之一,或者如果要执行其他操作而不是终止执行check_ajax_referer(),则可以指定其他参数。
验证在其他上下文中传递的随机数 若要验证在其他上下文中传递的随机数,请调用wp_verify_nonce()指定随机数和表示操作的字符串。
例如:
wp_verify_nonce( $_REQUEST['my_nonce'], 'process-comment'.$comment_id );
如果结果为 false,请不要继续处理请求。相反,请采取一些适当的操作。通常的操作是调用wp_nonce_ays() ,这会向浏览器发送“403 禁止访问”响应。
修改随机数系统
您可以通过添加各种操作和过滤器来修改随机数系统。
修改随机数生存期
默认情况下,随机数的生存期为一天。之后,即使随机数与操作字符串匹配,它也不再有效。若要更改生存期,请添加一个nonce_life筛选器,以秒为单位指定生存期。
例如,要将生存期更改为 4 小时:
add_filter( 'nonce_life', function () { return 4 * HOUR_IN_SECONDS; } );
执行其他验证
要在发现随机数和反向链接有效时执行其他验证,请添加check_admin_referrer()操作。
例如:
function wporg_additional_check ( $action, $result ) {
...
}
add_action( 'check_admin_referer', 'wporg_additional_check', 10, 2 );
以相同的方式添加check_ajax_referer()操作。check_ajax_referer
更改错误消息
您可以使用翻译系统更改随机数无效时发送的错误消息。例如:
function my_nonce_message ($translation) {
if ($translation === 'Are you sure you want to do this?') {
return 'No! No! No!';
}
return $translation;
}
add_filter('gettext', 'my_nonce_message');
其他信息
本节包含有关WordPress中随机数系统的其他信息,这些信息可能偶尔有用。
随机数寿命
请注意,就像WordPress随机数不是“使用一次的数字”一样,随机数寿命也不是真正的随机数寿命。WordPress使用具有两个即时报价(生命周期的一半)的系统,并验证当前即时报价和最后一个即时报价的随机数。在默认设置(24 小时生命周期)中,这意味着随机数中的时间信息与自 Unix 纪元以来经过的 12 小时时间段有关。这意味着在中午和午夜之间制作的随机数将具有有效期,直到第二天中午。因此,实际寿命在 12 到 24 小时之间变化。
当随机数有效时,验证随机数的函数返回当前即时报价编号 1 或 2。例如,您可以使用此信息刷新处于第二个时钟周期的随机数,以便它们不会过期。
随机数安全性
如果您正确安装了WordPress,则使用您网站独有的密钥和盐生成随机数。 并在您的文件中定义,并且该文件包含提供更多信息的注释。NONCE_KEYNONCE_SALTwp-config.php
绝不应依赖随机数进行身份验证或授权,或用于访问控制。使用 保护您的函数,始终假设 Nonces 可能会受到损害。current_user_can()
更换随机数系统
组成nonce系统的一些功能是可插拔的,因此您可以通过提供自己的功能来替换它们。
若要更改验证管理员请求或 AJAX 请求的方式,可以替换 check_admin_referrer()或 check_ajax_referrer(),或同时替换两者。
要将随机数系统替换为其他随机数系统,可以替换wp_create_nonce(),wp_verify_nonce() 和 wp_nonce_tick()。
nonce相关函数:
wp_nonce_ays(), wp_nonce_field(), wp_nonce_url(), wp_verify_nonce(), wp_create_nonce(), check_admin_referer(), check_ajax_referer(), wp_referer_field()
Nonce hooks: nonce_life, nonce_user_logged_out, explain_nonce_(verb)-(noun), check_admin_referer
转义输出是通过去除不需要的数据(如格式错误的 HTML 或脚本标记)来保护输出数据的过程。此过程有助于在为最终用户呈现数据之前保护数据。
注意:大多数WordPress函数可以正确准备输出数据,并且不需要额外的转义。
转义函数
WordPress有许多帮助程序函数,可用于最常见的场景。
密切注意每个函数的作用,因为有些函数会删除 HTML,而另一些函数会允许它。您必须对要回显的内容和上下文使用最合适的函数。你总是想在回声时逃离,而不是在回声之前。
- esc_html()– 每当 HTML 元素包含要显示的数据部分时,请使用。这将删除 HTML。
<h4><?php echo esc_html( $title ); ?></h4>
- esc_js()- 用于内联Javascript。
<div onclick='<?php echo esc_js( $value ); ?>' />
- esc_url()– 在所有 URL 上使用,包括 HTML 元素的 src 和 href 属性中的 URL。
<img alt="" src="<?php echo esc_url( $media_url ); ?>" />
- esc_url_raw()– 在数据库中存储 URL 或需要非编码 URL 的其他情况下使用。
- esc_xml()– 用于转义 XML 块。
- esc_attr()– 用于打印到 HTML 元素属性中的所有其他内容。
<ul class="<?php echo esc_attr( $stored_class ); ?>">
- esc_textarea()– 使用它来编码文本以在文本区域元素中使用。
- wp_kses()– 用于安全转义所有不受信任的 HTML(帖子文本、评论文本等)。这将保留 HTML。
- wp_kses_post()– 它的替代版本会自动允许帖子内容中允许的所有 HTML。wp_kses()
- wp_kses_data()– 替代版本仅允许帖子评论中允许的 HTML。wp_kses()
自定义转义示例
如果您需要以特定方式转义输出,函数 wp_kses()(发音为“kisses”)将派上用场。
此函数确保输出中仅出现指定的 HTML 元素、属性和属性值,并规范化 HTML 实体。
<?php
echo wp_kses_post( $partial_html );
echo wp_kses(
$another_partial_html,
array(
'a' => array(
'href' => array(),
'title' => array(),
),
'br' => array(),
'em' => array(),
'strong' => array(),
)
); ?>
在此示例中,除<a><br><em><strong>以外的所有标记都将被删除。此外,如果传递了<a>,则转义可确保仅返回 href和title。
总是转义得晚
最好尽可能晚地进行输出转义,最好是在输出数据时。
最好晚点转义,原因如下:
- 代码审查和部署可以更快地进行,因为它可以一目了然地认为可以安全地输出,而不是在很多行代码中搜寻以查看它是否已在何处以及是否已被转义。
- 某些内容可能会无意中更改变量的首次强制转换和输出时间之间的变量,从而引入潜在的漏洞。
- 延迟转义使自动代码扫描变得更加容易,从而节省时间并减少审查和部署时间。
- 尽可能延迟转义使代码更加健壮和面向未来。
- 在输出上转义/强制转换消除了任何歧义并增加了清晰度(始终为维护者开发)。
// Okay, but not great.
$url = esc_url( $url );
$text = esc_html( $text );
echo '<a href="'. $url . '">' . $text . '</a>';
// Much better!
echo '<a href="'. esc_url( $url ) . '">' . esc_html( $text ) . '</a>';
除非你不能
It is sometimes not practical to escape late. In a few rare circumstances output cannot be passed to wp_kses(), since by definition it would strip the scripts that are being generated.
In situations like this, always escape while creating the string and store the value in a variable that is a postfixed with _escaped, _safe or _clean (e.g., $variable becomes $variable_escaped or $variable_safe).
If a function cannot output internally and escape late, then it must always return “safe” HTML. This allows echo my_custom_script_code(); to be done without needing the script tag to be passed through a version of wp_kses() that would allow such tags.
通过本地化进行转义
通常使用 WordPress 本地化功能(例如 或 )。echo_e()__()
这些函数只是将本地化函数包装在转义函数中:
esc_html_e( 'Hello World', 'text_domain' );
// Same as
echo esc_html( __( 'Hello World', 'text_domain' ) );
这些帮助程序函数结合了本地化和转义:
例子
转义在任何地方使用的任何数值变量
echo $int;
根据它是整数还是a float, (int), absint(), (float) 都是正确且可接受的。
有时, number_format() or number_format_i18n()可能更合适。intval(), floatval()这些虽然可以,但这些是过时的PHP4的方法。
转义 HTML 属性中的任意变量
echo '<div id="', $prefix, '-box', $id, '">';
这应该通过一次调用 来转义。
当变量用作属性或 url 的一部分时,最好转义整个字符串,因为这样变量之前的潜在转义字符将被正确转义。esc_attr()
正确:
echo '<div id="', esc_attr( $prefix . '-box' . $id ), '">';
不對:
echo '<div id="', esc_attr( $prefix ), '-box', esc_attr( $id ), '">';
注意:如果在 HTML 属性中使用,则使用 创建的随机数也应该像这样进行转义。wp_create_nonce()
在 HTML 属性中转义任意 URL,但也在其他上下文中转义
echo '<a href="', $url, '">';
这应该使用 进行转义。esc_url()
正确:
echo '<a href="', esc_url( $url ), '">';
不對:
echo '<a href="', esc_attr( $url ), '">'; echo '<a href="', esc_attr( esc_url( $url ) ), '">';
通过 wp_localize_script() 将任意变量传递给 JavaScript
wp_localize_script( 'handle', 'name',
array(
'prefix_nonce' => wp_create_nonce( 'plugin-name' ),
'ajaxurl' => admin_url( 'admin-ajax.php' ),
'errorMsg' => __( 'An error occurred', 'plugin-name' ),
)
);
不需要转义,WordPress将转义这一点。
转义 JavaScript 块中的任意变量
<script type="text/javascript"> var myVar = <?php echo $my_var; ?> </script>
$my_var应使用 进行转义。esc_js()
正确:
<script type="text/javascript">
var myVar = <?php echo esc_js( $my_var ); ?>
</script>
在内联 JavaScript 中转义任意变量
<a href="#" onclick="do_something(<?php echo $var; ?>); return false;">
$var应使用 进行转义。esc_js()
正确:
<a href="#" onclick="do_something(<?php echo esc_js( $var ); ?>); return false;">
转义 HTML 属性中的任意变量以供 JavaScript 使用
<a href="#" data-json="<?php echo $var; ?>">
$var应使用 、 或 进行转义。esc_js()json_encode()wp_json_encode()
正确:
<a href="#" data-json="<?php echo esc_js( $var ); ?>">
转义 HTML 文本区域中的任意字符串
echo '<textarea>', $data, '</textarea>';
$data应使用 进行转义。esc_textarea()
正确:
echo '<textarea>', esc_textarea( $data ), '</textarea>';
转义 HTML 标记中的任意字符串
echo '<div>', $phrase, '</div>';
这取决于是否应包含 HTML。$phrase
- 如果没有,请使用或其任何变体。esc_html()
- 如果需要 HTML,请使用 或与一组要允许的 HTML 标记一起使用。wp_kses_post()wp_kses_allowed_html()wp_kses()
转义 XML 或 XSL 上下文中的任意字符串
echo '<loc>', $var, '</loc>';
使用 或 进行转义。esc_xml()ent2ncr()
正确:
echo '<loc>', ent2ncr( $var ), '</loc>';
不受信任的数据来自许多来源(用户、第三方站点,甚至您自己的数据库!),所有这些数据在使用前都需要进行检查。
请记住:即使是管理员也是用户,用户会有意或无意地输入不正确的数据。你的工作是保护他们免受自己的伤害。
清理输入是保护/清理/过滤输入数据的过程。验证优先于清理,因为验证更具体。但是,当“更具体”是不可能的时,消毒是下一个最好的选择。
例
假设我们有一个title变量
<input id="title" type="text" name="title">
我们不能在这里使用验证,因为文本字段太笼统了:它可以是任何东西。因此,我们使用以下函数清理输入数据:sanitize_text_field()
$title = sanitize_text_field( $_POST['title'] );
update_post_meta( $post->ID, 'title', $title );
在后台执行以下操作:sanitize_text_field()
- 检查无效的 UTF-8
- 将单个小于字符 (<) 转换为实体
- 去除所有标签
- 删除换行符、制表符和多余的空格
- 清楚八位字符
清除函数
有许多功能可以帮助您清理数据。
- sanitize_email()
- sanitize_file_name()
- sanitize_hex_color()
- sanitize_hex_color_no_hash()
- sanitize_html_class()
- sanitize_key()
- sanitize_meta()
- sanitize_mime_type()
- sanitize_option()
- sanitize_sql_orderby()
- sanitize_term()
- sanitize_term_field()
- sanitize_text_field()
- sanitize_textarea_field()
- sanitize_title()
- sanitize_title_for_query()
- sanitize_title_with_dashes()
- sanitize_user()
- sanitize_url()
- wp_kses()
- wp_kses_post()
不受信任的数据来自许多来源(用户、第三方站点,甚至您自己的数据库!),所有这些数据在使用前都需要进行检查。
请记住:即使是管理员也是用户,用户会有意或无意地输入不正确的数据。你的工作是保护他们免受自己的伤害。
验证输入是针对预定义模式(或多个模式)测试数据的过程,具有确定的结果:有效或无效。与清理相比,验证是一种更具体的方法,但两者都有其作用。
简单的验证示例:
- 检查必填字段是否未留空
- 检查输入的电话号码是否仅包含数字和标点符号
- 检查请求的字符串是否为五个有效选项之一
- 检查数量字段是否大于 0
应尽早执行数据验证。这意味着在执行任何操作之前验证数据。
验证理念
关于应该如何进行验证,有几种不同的哲学。每个方案都适用于不同的方案。
安全列表
仅接受来自已知值和可信值的有限列表中的数据。
将不受信任的数据与安全列表进行比较时,请务必确保使用严格的类型检查。否则,攻击者可能会以通过安全列表但仍具有恶意影响的方式创建输入。
比较运算符
$untrusted_input = '1 malicious string'; // will evaluate to integer 1 during loose comparisons
if ( 1 === $untrusted_input ) { // == would have evaluated to true, but === evaluates to false
echo '<p>Valid data';
} else {
wp_die( 'Invalid data' );
}
in_array()
$untrusted_input = '1 malicious string'; // will evaluate to integer 1 during loose comparisons
$safe_values = array( 1, 5, 7 );
if ( in_array( $untrusted_input, $safe_values, true ) ) { // `true` enables strict type checking
echo '<p>Valid data';
} else {
wp_die( 'Invalid data' );
}
switch()
$untrusted_input = '1 malicious string'; // will evaluate to integer 1 during loose comparisons
switch ( true ) {
case 1 === $untrusted_input: // do your own strict comparison instead of relying on switch()'s loose comparison
echo '<p>Valid data';
break;
default:
wp_die( 'Invalid data' );
}
阻止列表
拒绝已知不受信任值的有限列表中的数据。这很少是一个好主意。
格式检测
测试以查看数据格式是否正确。只有在它是的情况下才接受它。
if ( ! ctype_alnum( $data ) ) {
wp_die( "Invalid format" );
}
if ( preg_match( "/[^0-9.-]/", $data ) ) {
wp_die( "Invalid format" );
}
格式更正
接受大多数数据,但删除或更改危险部分。
$trusted_integer = (int) $untrusted_integer;
$trusted_alpha = preg_replace( '/[^a-z]/i', "", $untrusted_alpha );
$trusted_slug = sanitize_title( $untrusted_slug );
示例一
假设我们有一个旨在接受美国邮政编码的输入字段:
<input type="text" id="wporg_zip_code" name="my-zipcode" maxlength="10" />
在这里,我们告诉浏览器最多只允许十个字符的输入......但是他们可以输入的字符没有限制。他们可以进入或.11221eval()
这就是验证的用武之地。在处理表单时,我们编写代码来检查每个字段的正确数据类型,如果不正确则丢弃它。
例如:要检查该字段,我们可以执行以下操作:my-zipcode
/**
* Validate a US zip code.
*
* @param string $zip_code RAW zip code to check.
*
* @return bool true if valid, false otherwise.
*/
function wporg_is_valid_us_zip_code( string $zip_code ):bool {
// Scenario 1: empty.
if ( empty( $zip_code ) ) {
return false;
}
// Scenario 2: more than 10 characters.
// The `maxlength` attribute is only enforced by
// the browser, so we still need to validate the
// length of the input on the server to protect
// against a manual submission.
if ( 10 < strlen( trim( $zip_code ) ) ) {
return false;
}
// Scenario 3: incorrect format.
if ( ! preg_match( '/^d{5}(-?d{4})?$/', $zip_code ) ) {
return false;
}
// Passed successfully.
return true;
}
然后,在处理表单时,代码应检查字段并根据结果执行操作:wporg_zip_code
if ( isset( $_POST['wporg_zip_code'] ) && wporg_is_valid_us_zip_code( $_POST['wporg_zip_code'] ) ) {
// $_POST['wporg_zip_code'] is valid; carry on
}
请注意,此特定示例正在检查提供的数据格式是否正确;它不会检查提供且格式正确的数据是否为有效的邮政编码。为此,您需要第二个函数来与有效邮政编码列表进行比较。
示例二
假设您的代码将在数据库中查询帖子,并且您希望允许用户对查询结果进行排序。
$allowed_keys = array( 'author', 'post_author', 'date', 'post_date' );
$orderby = sanitize_key( $_POST['orderby'] );
if ( in_array( $orderby, $allowed_keys, true ) ) {
// $orderby is valid; carry on
}
此示例代码通过将传入排序键(存储在输入参数中)与允许的排序键数组进行比较来检查其有效性。这可以防止用户传入任意和潜在的恶意数据。orderby
在根据数组检查传入的排序键之前,该键被传递到内置的 WordPress 函数中。此函数确保(除其他外)键为小写,我们想要这样做,因为执行区分大小写的搜索。sanitize_key()in_array()
传入 的第三个参数将启用严格的类型检查,该参数告诉函数不仅要比较值,还要比较值类型。这允许代码确定传入的排序键是字符串,而不是其他数据类型。truein_array()
验证函数
大多数验证是作为自定义代码的一部分完成的,但也有一些帮助程序函数。这些是“清理”页面上列出的内容的补充。
- balanceTags( $html )or – 尝试确保 HTML 标记是平衡的,以便输出有效的 XML。force_balance_tags( $html )
- count()用于检查数组中有多少项
- in_array()用于检查数组中是否存在某些内容
- is_email()将验证电子邮件地址是否有效。
- in_array()用于检查数组中是否存在某些内容
- mb_strlen()或用于检查字符串是否具有预期的字符数strlen()
- preg_match(),用于检查其他字符串中某些字符串的出现情况strpos()
- sanitize_html_class( $class, $fallback )– 清理 html 类名以确保它只包含有效字符。将字符串剥离为 A-Z,a-z,0-9,'-',如果这导致空字符串,则它将返回提供的备用值。
- tag_escape( $html_tag_name )– 清理 HTML 标签名称(尽管函数名称不转义任何内容)。
- term_exists()检查是否存在标记、类别或其他分类术语。
- username_exists()检查用户名是否存在。
- validate_file()将验证输入的文件路径是否为真实路径(但不验证文件是否存在)。
查看WordPress代码参考以获取更多此类功能。搜索名称如下的函数:、 和 。并非所有这些都是验证函数,但许多都是有用的。*_exists()*_validate()is_*()
如果您的插件允许用户提交数据(无论是在管理员端还是公共端),它应该检查用户功能。
用户角色和功能
创建高效安全层的最重要步骤是建立用户权限系统。WordPress以用户角色和功能的形式提供此功能。
每个登录到WordPress的用户都会根据其用户角色自动分配特定的用户功能。
用户角色只是说用户属于哪个组的一种奇特方式。每个组都有一组特定的预定义功能。
例如,您网站的主要用户将具有管理员的用户角色,而其他用户可能具有编辑或作者等角色。您可以将多个用户分配给一个角色,即一个网站可能有两个管理员。
用户功能是您分配给每个用户或用户角色的特定权限。
例如,管理员具有“manage_options”功能,允许他们查看、编辑和保存网站的选项。另一方面,编辑器缺乏此功能,这将阻止他们与选项交互。
然后在管理员的不同位置检查这些功能。 取决于分配给角色的功能;可以添加或删除 WordPress 体验的菜单、功能和其他方面。
构建插件时,请确保仅在当前用户具有必要功能时才运行代码。
等级制度
用户角色越高,用户拥有的功能就越多。每个用户角色都继承层次结构中的先前角色。
例如,“管理员”是单个站点安装中最高的用户角色,继承以下角色及其功能:“订阅者”、“参与者”、“作者”和“编辑者”。
例子
无限制
下面的示例在前端创建了一个链接,该链接提供了垃圾帖子的功能。由于此代码不检查用户功能,因此它允许网站的任何访问者删除帖子!
/**
* Generate a Delete link based on the homepage url.
*
* @param string $content Existing content.
*
* @return string|null
*/
function wporg_generate_delete_link( $content ) {
// Run only for single post page.
if ( is_single() && in_the_loop() && is_main_query() ) {
// Add query arguments: action, post.
$url = add_query_arg(
[
'action' => 'wporg_frontend_delete',
'post' => get_the_ID(),
], home_url()
);
return $content . ' <a href="' . esc_url( $url ) . '">' . esc_html__( 'Delete Post', 'wporg' ) . '</a>';
}
return null;
}
/**
* Request handler
*/
function wporg_delete_post() {
if ( isset( $_GET['action'] ) && 'wporg_frontend_delete' === $_GET['action'] ) {
// Verify we have a post id.
$post_id = ( isset( $_GET['post'] ) ) ? ( $_GET['post'] ) : ( null );
// Verify there is a post with such a number.
$post = get_post( (int) $post_id );
if ( empty( $post ) ) {
return;
}
// Delete the post.
wp_trash_post( $post_id );
// Redirect to admin page.
$redirect = admin_url( 'edit.php' );
wp_safe_redirect( $redirect );
// We are done.
die;
}
}
/**
* Add the delete link to the end of the post content.
*/
add_filter( 'the_content', 'wporg_generate_delete_link' );
/**
* Register our request handler with the init hook.
*/
add_action( 'init', 'wporg_delete_post' );
仅限于特定功能
上面的示例允许网站的任何访问者单击“删除”链接并删除帖子。但是,我们只希望编辑及以上人员能够单击“删除”链接。
为此,我们将检查当前用户是否具有以下能力,只有编辑者或以上才能拥有:edit_others_posts
/**
* Generate a Delete link based on the homepage url.
*
* @param string $content Existing content.
*
* @return string|null
*/
function wporg_generate_delete_link( $content ) {
// Run only for single post page.
if ( is_single() && in_the_loop() && is_main_query() ) {
// Add query arguments: action, post.
$url = add_query_arg(
[
'action' => 'wporg_frontend_delete',
'post' => get_the_ID(),
], home_url()
);
return $content . ' <a href="' . esc_url( $url ) . '">' . esc_html__( 'Delete Post', 'wporg' ) . '</a>';
}
return null;
}
/**
* Request handler
*/
function wporg_delete_post() {
if ( isset( $_GET['action'] ) && 'wporg_frontend_delete' === $_GET['action'] ) {
// Verify we have a post id.
$post_id = ( isset( $_GET['post'] ) ) ? ( $_GET['post'] ) : ( null );
// Verify there is a post with such a number.
$post = get_post( (int) $post_id );
if ( empty( $post ) ) {
return;
}
// Delete the post.
wp_trash_post( $post_id );
// Redirect to admin page.
$redirect = admin_url( 'edit.php' );
wp_safe_redirect( $redirect );
// We are done.
die;
}
}
/**
* Add delete post ability
*/
add_action('plugins_loaded', 'wporg_add_delete_post_ability');
function wporg_add_delete_post_ability() {
if ( current_user_can( 'edit_others_posts' ) ) {
/**
* Add the delete link to the end of the post content.
*/
add_filter( 'the_content', 'wporg_generate_delete_link' );
/**
* Register our request handler with the init hook.
*/
add_action( 'init', 'wporg_delete_post' );
}
}
在编写WordPress插件时,您通常需要在整个WordPress安装过程中以及插件或主题中引用各种文件和文件夹。
WordPress提供了几个功能,用于轻松确定给定文件或目录的位置。始终在您的插件中使用这些函数,而不是硬编码对 wp-content 目录的引用或使用 WordPress 内部常量。
提示:WordPress允许用户将他们的wp内容目录放在他们想要的任何位置,并将其重命名为任何他们想要的名称。永远不要假设插件将在wp-content/plugins中,上传将在wp-content/uploads中,或者主题将在wp-content/themes中。
PHP 的魔术常数会自动解析符号链接,因此如果 or 甚至单个插件目录是符号链接的,硬编码路径将无法正常工作。__FILE__wp-contentwp-content/plugins
常见用法
如果您的插件包含 JavaScript 文件、CSS 文件或其他外部文件,那么您可能需要这些文件的 URL,以便将它们加载到页面中。为此,您应该使用 plugins_url() 函数,如下所示:
plugins_url( 'myscript.js', __FILE__ );
这会将完整的 URL 返回到 myscript.js,例如 .example.com/wp-content/plugins/myplugin/myscript.js
要将插件的 JavaScript 或 CSS 加载到页面中,您应该分别使用 wp_enqueue_script() 或 wp_enqueue_style(),将结果作为文件 URL 传递。plugins_url()
可用功能
WordPress包括许多其他功能,用于确定插件,主题和WordPress本身中文件或目录的路径和URL。有关其使用的完整信息,请参阅每个函数的单个 DevHub 页。
插件
plugins_url()
plugin_dir_url()
plugin_dir_path()
plugin_basename()
主题
get_template_directory_uri()
get_stylesheet_directory_uri()
get_stylesheet_uri()
get_theme_root_uri()
get_theme_root()
get_theme_roots()
get_stylesheet_directory()
get_template_directory()
网站主页
home_url()
get_home_path()
WordPress
admin_url()
site_url()
content_url()
includes_url()
wp_upload_dir()
多站点
get_admin_url()
get_home_url()
get_site_url()
network_admin_url()
network_site_url()
network_home_url()
常数
WordPress在确定内容和插件目录的路径时使用以下常量。这些不应由插件或主题直接使用,但为了完整起见,此处列出。
WP_CONTENT_DIR // no trailing slash, full paths only
WP_CONTENT_URL // full url
WP_PLUGIN_DIR // full path, no trailing slash
WP_PLUGIN_URL // full url, no trailing slash
// Available per default in MS, not set in single site install
// Can be used in single site installs (as usual: at your own risk)
UPLOADS // (If set, uploads folder, relative to ABSPATH) (for e.g.: /wp-content/uploads)
相关
WordPress目录:
以下是一些最佳实践,可帮助您组织代码,使其与WordPress核心和其他WordPress插件配合使用。
避免命名冲突
当您的插件对变量、函数或类使用与另一个插件相同的名称时,就会发生命名冲突。
幸运的是,您可以使用以下方法避免命名冲突。
程序编码方法
默认情况下,所有变量、函数和类都在全局命名空间中定义,这意味着您的插件可以覆盖另一个插件设置的变量、函数和类,反之亦然。在函数或类内部定义的变量不受此影响。
为一切添加前缀
所有全局可访问的代码都应以唯一标识符为前缀。前缀可防止其他插件覆盖您的变量并意外调用您的函数和类。它还将阻止您这样做。
为了防止与其他插件冲突,您的前缀长度应至少为 5 个字母。您应该避免使用常见的英语单词,而是为您的插件选择独特的内容。
应添加前缀的代码包括:
- 函数(除非已命名)
- 类、接口和特征(除非已命名)
- 命名空间
- 全局变量
- 选项和瞬态
检查现有实现
PHP 提供了许多函数来验证变量、函数、类和常量的存在。如果实体存在,所有这些都将返回 true。
- 变量:isset() (包括数组、对象等)
- 函数: function_exists()
- 类:class_exists()
- 常量: defined()
例
// Create a function called "wporg_init" if it doesn't already exist
if ( ! function_exists( 'wporg_init' ) ) {
function wporg_init() {
register_setting( 'wporg_settings', 'wporg_option_foo' );
}
}
// Create a function called "wporg_get_foo" if it doesn't already exist
if ( ! function_exists( 'wporg_get_foo' ) ) {
function wporg_get_foo() {
return get_option( 'wporg_option_foo' );
}
}
面向对象编程方法
解决命名冲突问题的一种更简单的方法是对插件的代码使用类。
您仍然需要检查所需的类的名称是否已被占用,但其余的将由 PHP 处理。
例
if ( ! class_exists( 'WPOrg_Plugin' ) ) {
class WPOrg_Plugin {
public static function init() {
register_setting( 'wporg_settings', 'wporg_option_foo' );
}
public static function get_foo() {
return get_option( 'wporg_option_foo' );
}
}
WPOrg_Plugin::init();
WPOrg_Plugin::get_foo();
}
文件组织
插件目录的根级别应包含您的文件,也可以选择包含卸载.php文件。所有其他文件应尽可能组织到子文件夹中。plugin-name.php
文件夹结构
清晰的文件夹结构可帮助您和处理插件的其他人将类似的文件放在一起。
下面是一个示例文件夹结构供参考:
/plugin-name
plugin-name.php
uninstall.php
/languages
/includes
/admin
/js
/css
/images
/public
/js
/css
/images
插件架构
您为插件选择的架构或代码组织可能取决于插件的大小。
对于与 WordPress 核心、主题或其他插件交互有限的小型单一用途插件,工程复杂类几乎没有什么好处;除非您知道该插件稍后会大大扩展。
对于包含大量代码的大型插件,请从类开始。单独的样式和脚本文件,甚至与构建相关的文件。这将有助于代码组织和插件的长期维护。
条件加载
将管理员代码与公共代码分开很有帮助。使用条件 is_admin() 。您仍必须执行功能检查,因为这并不表示用户已通过身份验证或具有管理员级别的访问权限。请参阅检查用户功能。
例如:
if ( is_admin() ) {
// we are in admin mode
require_once __DIR__ . '/admin/plugin-name-admin.php';
}
避免直接文件访问
作为安全预防措施,如果未定义全局,最好禁止访问。这仅适用于包含类或函数定义之外的代码的文件,例如主插件文件。ABSPATH
您可以通过在文件顶部包含以下代码来实现这一点:
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
架构模式
虽然有许多可能的体系结构模式,但它们大致可以分为三种变体:
架构模式解释
上述更复杂的代码组织的具体实现已经写成教程和幻灯片:
样板起点
与其为您编写的每个新插件从头开始,不如从样板开始。使用样板的一个优点是您自己的插件之间保持一致性。如果您使用其他人已经熟悉的样板文件,样板还可以让其他人更轻松地为您的代码做出贡献。
这些也可以作为不同但可比较的体系结构的进一步示例。
- WordPress插件样板:WordPress插件开发的基础,旨在为构建插件提供清晰一致的指南。
- WordPress插件引导:使用Grunt,Compass,GIT和SVN开发WordPress插件的基本引导程序。
- WP骨架插件:专注于单元测试和使用作曲家进行开发的骨架插件。
- WP CLI 脚手架:WP CLI 的脚手架命令创建一个带有 CI 配置文件等选项的框架插件
当然,您可以采用这些和其他方面的不同方面来创建自己的自定义样板。
从站点卸载插件时,可能需要进行一些清理。
如果用户停用了插件,然后单击WordPress Admin中的删除链接,则认为该插件已卸载。
卸载插件后,您需要清除特定于插件的任何插件选项和/或设置,和/或其他数据库实体(如表)。
经验不足的开发人员有时会犯错误,为此目的使用停用钩子。
下表说明了停用和卸载之间的差异。
场景 | 停用钩子 | 卸载钩子 |
---|---|---|
Flush Cache/Temp | 是 | 不 |
Flush Permalinks | 是 | 不 |
Remove Options from {$wpdb->prefix}_options | 不 | 是 |
Remove Tables from wpdb | 不 | 是 |
方法1:register_uninstall_hook
要设置卸载钩子,请使用 register_uninstall_hook() 函数:
register_uninstall_hook(
__FILE__,
'pluginprefix_function_to_run'
);
方法2:uninstall.php
要使用此方法,您需要在插件的根文件夹中创建一个文件。当用户删除插件时,此魔术文件会自动运行。uninstall.php
例如:/plugin-name/uninstall.php
警报:在执行任何操作之前,请务必检查常量。这可以防止直接访问。WP_UNINSTALL_PLUGINuninstall.php
常量将由WordPress在调用期间定义。uninstall.php
当 register_uninstall_hook() 执行卸载时,未定义该常量。
下面是删除选项条目和删除数据库表的示例:
// if uninstall.php is not called by WordPress, die
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
die;
}
$option_name = 'wporg_option';
delete_option( $option_name );
// for site options in Multisite
delete_site_option( $option_name );
// drop a custom database table
global $wpdb;
$wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}mytable" );
注意:在多站点中,遍历所有博客以删除选项可能会占用大量资源。
激活和停用钩子提供了在激活或停用插件时执行操作的方法。
- 激活时,插件可以运行例程来添加重写规则、添加自定义数据库表或设置默认选项值。
- 停用后,插件可以运行例程来删除临时数据,例如缓存和临时文件和目录。
警报:停用钩子有时会与卸载钩子混淆。卸载钩子最适合永久删除所有数据,例如删除插件选项和自定义表等。
激活
要设置激活挂钩,请使用 register_activation_hook() 函数:
register_activation_hook(
__FILE__,
'pluginprefix_function_to_run'
);
停用
要设置停用钩子,请使用 register_deactivation_hook()函数:
register_deactivation_hook(
__FILE__,
'pluginprefix_function_to_run'
);
每个函数中的第一个参数是指您的主插件文件,该文件是您在其中放置插件头注释的文件。通常这两个函数将从主插件文件中触发;但是,如果函数放置在任何其他文件中,则必须更新第一个参数以正确指向主插件文件。
示例
激活钩子最常见的用途之一是在插件注册自定义帖子类型时刷新WordPress永久链接。这摆脱了令人讨厌的 404 错误。
让我们看一个如何执行此操作的示例:
/**
* Register the "book" custom post type
*/
function pluginprefix_setup_post_type() {
register_post_type( 'book', ['public' => true ] );
}
add_action( 'init', 'pluginprefix_setup_post_type' );
/**
* Activate the plugin.
*/
function pluginprefix_activate() {
// Trigger our function that registers the custom post type plugin.
pluginprefix_setup_post_type();
// Clear the permalinks after the post type has been registered.
flush_rewrite_rules();
}
register_activation_hook( __FILE__, 'pluginprefix_activate' );
如果您不熟悉注册自定义帖子类型,请不要担心,这将在后面介绍。使用此示例只是因为它非常常见。
使用上面的例子,以下是如何逆转此过程并停用插件:
/**
* Deactivation hook.
*/
function pluginprefix_deactivate() {
// Unregister the post type, so the rules are no longer in memory.
unregister_post_type( 'book' );
// Clear the permalinks to remove our post type's rules from the database.
flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, 'pluginprefix_deactivate' );
有关激活和停用钩子的更多信息,这里有一些优秀的资源:
- register_activation_hook() 在 WordPress 函数参考中。
- register_deactivation_hook() 在 WordPress 函数参考中。
大多数WordPress插件都是在GPL下发布的,GPL与WordPress本身使用的许可证相同。但是,还有其他兼容选项可用。最好清楚地指出您的插件使用的许可证。
在标题要求部分,我们简要提到了如何在插件标题注释中指示插件的许可证。另一种常见且鼓励的做法是在主插件文件(与具有插件标题注释的相同文件)的顶部附近放置许可证块注释。
此许可证块注释通常如下所示:
/*
{Plugin Name} is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
any later version.
{Plugin Name} is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with {Plugin Name}. If not, see {URI to Plugin License}.
*/
简单来说,WordPress插件是一个带有WordPress插件标题注释的PHP文件。强烈建议您创建一个目录来保存您的插件,以便您的所有插件文件都整齐地组织在一个地方。
要开始创建新插件,请按照以下步骤操作。
- 导航到WordPress安装的wp-content目录。
- 打开插件目录。
- 创建一个新目录并以插件命名(例如 )。plugin-name
- 打开新插件的目录。
- 创建一个新的 PHP 文件(最好以插件命名此文件,例如)。plugin-name.php
以下是该过程在 Unix 命令行上的外观:
wordpress $ cd wp-content
wp-content $ cd plugins
plugins $ mkdir plugin-name
plugins $ cd plugin-name
plugin-name $ vi plugin-name.php
在上面的示例中, 是文本编辑器的名称。使用适合您的编辑器。vi
现在您正在编辑新插件的 PHP 文件,您需要添加插件标题注释。这是一个特殊格式的 PHP 块注释,其中包含有关插件的元数据,例如其名称、作者、版本、许可证等。插件标头注释必须符合标头要求,并且至少包含插件的名称。
插件文件夹中只有一个文件应该有标题注释 — 如果插件有多个 PHP 文件,则只有一个文件应该有标题注释。
保存文件后,您应该能够在WordPress站点中看到您的插件。登录到您的WordPress网站,然后单击WordPress管理员左侧导航窗格中的插件。此页面显示您的WordPress网站拥有的所有插件的列表。您的新插件现在应该在该列表中!
钩子:操作和过滤器
WordPress钩子允许您在特定点利用WordPress来更改WordPress的行为方式,而无需编辑任何核心文件。
WordPress中有两种类型的钩子:动作和过滤器。操作允许您添加或更改WordPress功能,而过滤器允许您在加载和显示给网站用户时更改内容。
钩子不仅适用于插件开发人员;钩子被广泛用于提供WordPress核心本身的默认功能。其他钩子是未使用的占位符,当您需要更改WordPress的工作方式时,您可以使用它们。这就是WordPress如此灵活的原因。
基本挂钩
创建插件时需要的 3 个基本钩子是 register_activation_hook()、register_deactivation_hook() 和 register_uninstall_hook()。
激活钩子在您激活插件时运行。您可以使用它来提供一个函数来设置您的插件 - 例如,在表中创建一些默认设置。options
停用钩子在您停用插件时运行。您将使用它来提供一个函数来清除插件存储的任何临时数据。
这些卸载方法用于在使用WordPress管理员删除插件后进行清理。您将使用它来删除插件创建的所有数据,例如添加到表中的任何选项。options
添加钩子
您可以使用 do_action() 添加自己的自定义钩子,这将使开发人员能够通过钩子传递函数来扩展您的插件。
移除钩子
您还可以使用 invoke remove_action() 删除之前定义的函数。例如,如果您的插件是另一个插件的附加组件,则可以将 remove_action() 与上一个插件添加的函数回调一起使用 add_action()。在这些情况下,操作的优先级很重要,因为 remove_action() 需要在初始 add_action() 之后运行。
从钩子中删除操作以及更改优先级时应小心,因为很难看出这些更改将如何影响具有同一钩子的其他交互。我们强烈建议经常进行测试。
您可以在本手册的 Hooks 部分了解有关创建钩子并与之交互的更多信息。
WordPress API
你知道WordPress提供了许多应用程序编程接口(API)吗?这些 API 可以大大简化您需要在插件中编写的代码。你不想重新发明轮子,尤其是当这么多人为你做了很多工作和测试时。
最常见的是选项 API,它可以轻松地将数据存储在插件的数据库中。如果您正在考虑在插件中使用 cURL,您可能会对 HTTP API 感兴趣。
由于我们谈论的是插件,因此您需要学习插件 API。它具有多种功能,可帮助您开发插件。
WordPress如何加载插件
当WordPress在WordPress Admin的插件页面上加载已安装插件的列表时,它会搜索文件夹(及其子文件夹)以查找带有WordPress插件标题注释的PHP文件。如果您的整个插件仅包含一个PHP文件,例如Hello Dolly,则该文件可能直接位于文件夹的根目录中。但更常见的是,插件文件将驻留在自己的文件夹中,以插件名命名。
分享您的插件
有时,您创建的插件仅适用于您的网站。但是许多人喜欢与WordPress社区的其他成员分享他们的插件。在共享插件之前,您需要做的一件事是选择许可证。这让你的插件的用户知道如何允许他们使用你的代码。为了保持与WordPress核心的兼容性,建议您选择与GNU通用公共许可证(GPLv2+)一起使用的许可证。
插件是扩展WordPress核心功能的代码包。WordPress插件由PHP代码组成,可以包括其他资产,如图像,CSS和JavaScript。
通过制作自己的插件,您正在扩展WordPress,即在WordPress已经提供的功能之上构建其他功能。例如,您可以编写一个插件,显示指向您网站上十个最新帖子的链接。
或者,使用 WordPress 的自定义帖子类型,您可以编写一个插件,创建一个功能齐全的支持票务系统,其中包含电子邮件通知、自定义工单状态和面向客户端的门户。可能性是无穷无尽的!
大多数WordPress插件由许多文件组成,但一个插件实际上只需要一个主文件,标题中有一个特定格式的DocBlock。
Hello Dolly,最早的插件之一,只有100行长。Hello Dolly在WordPress管理中显示了这首著名歌曲的歌词。PHP 文件中使用了一些 CSS 来控制歌词的样式。
作为 WordPress.org 插件作者,您有一个绝佳的机会来创建数百万WordPress用户将安装,修补和喜爱的插件。您需要做的就是将您的好主意转化为代码。插件手册在这里为您提供帮助。
钩子是一段代码在特定预定义位置交互/修改另一段代码的一种方式。它们构成了插件和主题如何与WordPress Core交互的基础,但它们也被Core本身广泛使用。
有两种类型的钩子:操作和过滤器。要使用其中任何一个,您需要编写一个称为 的自定义函数,然后使用 WordPress 挂钩注册它以进行特定操作或过滤器。Callback
操作允许您添加数据或更改WordPress的运行方式。操作将在执行WordPress Core,插件和主题的特定点运行。Actions 的回调函数可以执行某种任务,例如向用户回显输出或将某些内容插入数据库。Action 的回调函数不会向调用 Action 挂钩返回任何内容。
过滤器使您能够在执行WordPress Core,插件和主题期间更改数据。筛选器的回调函数将接受变量,修改它,然后返回它。它们旨在以隔离的方式工作,并且不应产生副作用,例如影响全局变量和输出。过滤器希望将某些内容返回给它们。
WordPress提供了许多您可以使用的钩子,但您也可以创建自己的钩子,以便其他开发人员可以扩展和修改您的插件或主题。
操作与筛选器
操作和筛选器之间的主要区别可以总结如下:
- 操作获取它收到的信息,对其执行某些操作,并且不返回任何内容。换句话说:它作用于某物,然后退出,不返回任何内容返回调用钩子。
- 筛选器获取它收到的信息,以某种方式修改它,然后返回它。换句话说:它过滤一些东西并将其传递回钩子以供进一步使用。
换一种说法:
- 操作中断代码流以执行某些操作,然后返回到正常流而不进行任何修改;
- 筛选器用于以特定方式修改某些内容,以便代码稍后使用该修改。
所指的东西是通过钩子定义发送的参数列表。在后面的部分中将对此进行详细介绍。