文章可见性设置
发布 WordPress 文章(或页面)后,它默认是公开可见的。在 WordPress 中,这意味着状态为“已发布”的文章默认可见性为“公开”,这是根据“发布”模块中“编辑文章屏幕”的设置而定的。
WordPress 还为您的文章内容可见性提供了两种不那么公开的选项。点击“可见性:公开”旁边的“编辑”链接会显示三个单选按钮
- 默认选择“公开”。
- 勾选“密码保护”会显示一个文本字段,用于输入密码,查看该文章需要此密码。密码限制为 20 个字符。
- 勾选“私密”会使您的文章仅对具有管理员或编辑角色的网站用户可见。可见性设置

编辑完文章的可见性后,点击“确定”按钮。您现在应该能看到文章的新设置,例如:可见性:密码保护。请记住:设置更改只有在您点击“发布”按钮(如果文章已发布,则为“更新”)后才会生效。
查找或更改密码
只有管理员、编辑或文章作者才能更改文章的密码或可见性设置。要更改,请再次使用“可见性:编辑”链接。这些设置也可以通过“所有文章”屏幕中文章的“快速编辑”链接进行修改。
“可见性”的“编辑”链接(或“快速编辑”)也是找回忘记的文章密码的好方法。
密码保护的文章
WordPress 以不同的方式显示密码保护的文章。它会对文章的以下部分进行更改:
- 标题 – 在文章标题前添加文本“Protected: ”。
- 摘录 – 不显示文章摘录,而是显示以下文本:“There is no excerpt because this is a protected post.”
- 内容 – 不显示文章内容,而是显示一个带有以下文本的密码表单:“This post is password protected. To view it please enter your password below:”

因此,一篇标题为“我的文章”的密码保护文章将显示如下:
密码保护多篇文章和页面
WordPress 将此密码存储在浏览器 Cookie 中,这样读者多次访问同一页面时无需重新输入密码。此外,如果多篇文章使用相同的密码,读者只需输入一次密码即可访问所有文章(参见下方的注意事项)。
WordPress 一次只跟踪一个密码。因此,如果两篇文章使用两个不同的密码,输入文章 A 的密码,然后输入文章 B 的密码,这意味着重新访问文章 A(或任何共享其密码的文章)将需要用户重新输入文章 A 的密码。
保护自定义字段
WordPress 不会显示密码保护文章的内容或摘录,直到输入正确的密码。但是文章的自定义字段数据不受保护,仍然可以显示。为了阻止自定义字段显示,请将您的get_post_meta调用(例如,在 single.php 或 page.php 中)用包含post_password_required的条件语句包裹起来。这个 WordPress 函数会检查您的文章是否需要密码以及是否提供了正确的密码。
<?php if ( ! post_password_required() ) { // Code to fetch and print CFs, such as: $key_1_value_1 = get_post_meta( $post->ID, 'key_1', true ); echo $key_1_value_1; } ?>
将 post_password_required 函数放在 if 语句中,也方便进行其他自定义,例如防止密码保护的文章显示在列表中。
自定义受保护文本
使用WordPress 过滤器,您可以:更改密码表单中的默认文本,更改密码保护文章摘录的默认文本,以及将密码表单插入到文章摘录中。为此,请将以下代码添加到您的自定义插件文件中。
密码表单文本
密码表单显示此默认消息:“This post is password protected. To view it please enter your password below:” 以下代码将返回带有不同文本和不同 HTML 结构的表单——在此示例中,自定义消息为:“To view this protected post, enter the password below:”
<?php function my_password_form() { global $post; $label = 'pwbox-'.( empty( $post->ID ) ? rand() : $post->ID ); $o = '<form action="' . esc_url( site_url( 'wp-login.php?action=postpass', 'login_post' ) ) . '" method="post"> ' . __( "To view this protected post, enter the password below:" ) . ' <label for="' . $label . '">' . __( "Password:" ) . ' </label><input name="post_password" id="' . $label . '" type="password" size="20" maxlength="20" /><input type="submit" name="Submit" value="' . esc_attr__( "Submit" ) . '" /> </form> '; return $o; } add_filter( 'the_password_form', 'my_password_form' ); ?>
请注意:my_password_form 函数必须返回值:不要使用 print 或 echo。
密码长度限制
在替换密码保护表单时,请务必将 maxlength 参数设置为 20,因为 WordPress 由于数据库限制只会保存前 20 个字符。
受保护摘录文本
密码保护文章的默认摘录是:“There is no excerpt because this is a protected post.” 此代码将用您自己的文本替换它——允许使用 HTML
<?php function my_excerpt_protected( $excerpt ) { if ( post_password_required() ) $excerpt = '<em>[This is password-protected.]</em>'; return $excerpt; } add_filter( 'the_excerpt', 'my_excerpt_protected' ); ?>
将“<em>[This is password-protected.]</em>”替换为您自定义的密码保护摘录消息。
将密码表单添加到摘录
对于受保护的摘录,另一个选项是显示密码表单而不是摘录消息。这样人们可以直接从索引页或归档页输入密码。然后,当他们点击标题链接时,他们将看到内容。使用 get_the_password_form 函数,您可以使密码表单成为密码保护文章的摘录。
<?php function my_excerpt_password_form( $excerpt ) { if ( post_password_required() ) $excerpt = get_the_password_form(); return $excerpt; } add_filter( 'the_excerpt', 'my_excerpt_password_form' ); ?>
这将获取默认的 WordPress 密码表单和文本,或者您所做的任何自定义。为了更好地理解 post_password_required() 和 get_the_password_form() 的工作原理,请阅读它们在 wp-includes/post-template.php
中的函数定义。
在同一个 WordPress 核心文件中,您还会找到 the_excerpt 和 the_password_form 过滤器,以及 get_the_excerpt()、get_the_title() 和 get_the_content() 函数。这些函数根据文章的可见性设置控制文章标题、摘录和内容的显示方式。
隐藏密码保护的文章
有时,您可能不希望密码保护的文章出现在您网站的其他位置,例如主页或归档页面。为了有效地将它们从这些页面中隐藏起来而不影响您的分页,请将以下代码放置在您的自定义插件文件中。
<?php // Filter to hide protected posts function exclude_protected($where) { global $wpdb; return $where .= " AND {$wpdb->posts}.post_password = '' "; } // Decide where to display them function exclude_protected_action($query) { if( !is_single() && !is_page() && !is_admin() ) { add_filter( 'posts_where', 'exclude_protected' ); } } // Action to queue the filter at the right time add_action('pre_get_posts', 'exclude_protected_action'); ?>
此代码分为两部分:第一部分使用posts_where 过滤器,有效地将所有密码保护的文章直接从 WordPress 运行的任何 SQL 查询中移除。第二部分将此过滤器添加到除单篇文章、页面和管理页面之外的所有页面。
有关为什么 pre_get_posts 是此函数的正确动作的更多信息,请参阅pre_get_posts 动作参考。
更改 Cookie 生命周期
参见 https://developer.wordpress.org/reference/hooks/post_password_expires/
这篇文章有帮助吗?如何改进?
登录以提交反馈。如果您需要本文未涵盖的支持,请在支持论坛中提出您的问题。