在WordPress中让注册用户更方便的阅读受密码保护的日志

WordPress不能设置游客与注册用户在阅读受密码保护的日志或页面时的权限。对于已经登陆的注册用户来说,要阅读受密码保护的日志或页面仍需输入作者所要求的密码,很是烦人。
即使是作者本人也是如此。因此,对于像“项目管理日志”这样的每篇日志都设置了阅读密码的博主来讲,自己阅读自己的日志都非常麻烦。
为了解决这个问题,搜索试用了一堆插件,不是不能达到目的,就是功能太过复杂。遂,自己动手,改了下Wordpress,完成自己的需求 — 爽!

需求:
已经登陆的用户,无需输入密码就可以访问被密码保护的日志或页面。

实现思路:
在某处添加检查当前访问用户是否是登陆用户。“是”则直接显示日志或页面内容;“否”则显示密码输入框。

前提条件:
所用的博客皮肤,使用the_content()这个函数来实现日志或页面显示的。 — 大部分的皮肤都是用的这个函数。

实现方法一 — 修改Wordpress代码文件:
修改Wordpress的wp-includes/post-template.php 文件:在文件中搜索get_the_content函数,找到这一段:

if ( post_password_required($post) ) {
$output = get_the_password_form();
return $output;
}

为其添加是否登陆用户的权限校验即可。修改代码如下:

if ( !is_user_logged_in() && post_password_required($post) ) {
$output = get_the_password_form();
return $output;
}

优点:方便。
缺点:wordpress升级可能会更新此文件,如果文件被更新则需重新修改。

实现方法二 — 修改皮肤代码文件:
将the_content()和get_the_content()函数重写下,在皮肤文件里调用新的函数。
在皮肤的functions.php里添加如下重写后的代码:

<?php
/**
* Display the post content.
*
* @since 0.71
*
* @param string $more_link_text Optional. Content for when there is more text.
* @param string $stripteaser Optional. Teaser content before the more text.
*/
function the_content2($more_link_text = null, $stripteaser = 0) {
$content = get_the_content2($more_link_text, $stripteaser);
$content = apply_filters(‘the_content’, $content);
$content = str_replace(‘]]>’, ‘]]&gt;’, $content);
echo $content;
}

/**
* Retrieve the post content.
*
* @since 0.71
*
* @param string $more_link_text Optional. Content for when there is more text.
* @param string $stripteaser Optional. Teaser content before the more text.
* @return string
*/
function get_the_content2($more_link_text = null, $stripteaser = 0) {
global $id, $post, $more, $page, $pages, $multipage, $preview;

if ( null === $more_link_text )
$more_link_text = __( ‘(more…)’ );

$output = ”;
$hasTeaser = false;

// If post password required and it doesn’t match the cookie.
if ( !is_user_logged_in() && post_password_required($post) ) {
$output = get_the_password_form();
return $output;
}

if ( $page > count($pages) ) // if the requested page doesn’t exist
$page = count($pages); // give them the highest numbered page that DOES exist

$content = $pages[$page-1];
if ( preg_match(‘/<!–more(.*?)?–>/’, $content, $matches) ) {
$content = explode($matches[0], $content, 2);
if ( !empty($matches[1]) && !empty($more_link_text) )
$more_link_text = strip_tags(wp_kses_no_null(trim($matches[1])));

$hasTeaser = true;
} else {
$content = array($content);
}
if ( (false !== strpos($post->post_content, ‘<!–noteaser–>’) && ((!$multipage) || ($page==1))) )
$stripteaser = 1;
$teaser = $content[0];
if ( ($more) && ($stripteaser) && ($hasTeaser) )
$teaser = ”;
$output .= $teaser;
if ( count($content) > 1 ) {
if ( $more ) {
$output .= ‘<span id=”more-‘ . $id . ‘”></span>’ . $content[1];
} else {
if ( ! empty($more_link_text) )
$output .= apply_filters( ‘the_content_more_link’, ‘ <a href=”‘ . get_permalink() . “#more-$id\” class=\”more-link\”>$more_link_text</a>”, $more_link_text );
$output = force_balance_tags($output);
}

}
if ( $preview ) // preview fix for javascript bug with foreign languages
$output =    preg_replace_callback(‘/\%u([0-9A-F]{4})/’, create_function(‘$match’, ‘return “&#” . base_convert($match[1], 16, 10) . “;”;’), $output);

return $output;
}
?>

然后将所有皮肤文件中的the_content()函数修改为the_content2()函数即可。
优点:解决Wordpress升级就要改一次代码的问题。
缺点:需要细心一些,把皮肤文件中所有的the_content改完;如果换肤的话,需要重做一次。

One Response to “在WordPress中让注册用户更方便的阅读受密码保护的日志”

  1. 沈蚊说道:

    写成插件吧~~

Leave a Reply

Dansette