使用密码保护文章

文章可见性设置

发布 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 动作参考

参见 https://developer.wordpress.org/reference/hooks/post_password_expires/

这篇文章有帮助吗?如何改进?

首次发布

最后更新