分类
WordPress

WordPress官方列表收集:函数、勾子、全局参数等

函数列表?http://codex.wordpress.org/zh-cn:%E5%87%BD%E6%95%B0%E5%8F%82%E8%80%83

勾子?http://codex.wordpress.org/Plugin_API/Action_Reference

全局参数?http://codex.wordpress.org/User:CharlesClarkson/Global_Variables

分类
WordPress

取消wordpress自动草稿和版本

在以往乌徒帮并没注意到这个问题,wordpress内的自动草稿和版本会增加很多没有实际作用的文章记录,这些记录占据着我们的数据库,导致文章ID不断增大,目前乌徒帮只有上百篇的文章,ID号已经升到一千多。

那么怎么去取消自动保存草稿功能了,很简单,在functions.php中添加以下代码:

function disable_autosave() {
wp_deregister_script(‘autosave’);
}
add_action( ‘wp_print_scripts’, ‘disable_autosave’ );

而如何取消自动保存文章版本呢,增加下面代码即可:

define(‘WP_POST_REVISIONS’, false);

而著名的插件disable-revisions-and-autosave也就只有这几句实际代码,你可以下载使用

disable-autosave.zip?(Right Click – Save As) – Disable Autosave function
disable-revisions.zip?(Right Click – Save As) – Disable Revisions function
disable-revisions-and-autosave.zip?(Right Click – Save As) – Disable Revisions and Autosave at the same time.

也有网友发现一个问题,如果你点击了写文章,进入到写文章页面,然而这个时候你又突然想进行另外一个操作,那么这个时候会产生一个空的自动草稿,无论你是否点击发布按钮,还是你一个字未写,它都会产生。解决方法是:依旧启用原先的disable revisions and autosave插件,然后编辑wp-admin/includes/post.php文件,在?if ( $create_in_db ) {?语句之前加入一行?$create_in_db = false;?语句,经过实际测试,增加了这一行之后,新建日志,数据库就不会出现一篇自动存档的草稿了。

注意:新的wordpress在admin/post-new.php中找到get_default_post_to_edit( $post_type, true );将第二个参数改为false即可。该函数是在上面的wp-admin/includes/post.php中定义,上面所说的其实是修改了函数源,在使用中其实第二个函数默认是false,只是在admin/post-new.php中传递的是true而已。

补充:在笔者看来,其实自动保存草稿的功能还是应该保留的,特别是网络状况不好的情况下,假如一不小心断网或断电的情况下,由于wordpress的编辑框并没有记忆功能,写了很多的文字,岂不是就没有了。保存草稿起码能保存大部分文字,以防万一。所以乌徒帮仍然保留了保存草稿功能,而禁用了文章版本功能。

但同时我也发现一个问题,如果仍然保留自动保存草稿功能,在更新文章时,也会自动保存草稿,这时,这个草稿又变成了一个修订版,但这个修订版只会出现一次,无论你保存多少次草稿,它只有一个修订版,也就是说每篇文章当你进行修改时,会多出一个修订版。相当于没有禁止掉。因此,如果你特别讨厌这些新增的版本,就将两者都禁用。

而另外一款插件叫做:revision-control 可以帮你解决版本控制的问题,但它和define(‘WP_POST_REVISIONS’, false);不能共用。

参考一

分类
WordPress

为wordpress添加回复时邮件通知功能剖析

网上有很多关于给wordpress的评论添加在回复时用邮件通知被回复者的文章,而且都实现的无插件化,只需要不多的代码即可。乌徒帮之前也有一篇文章,不仅提供了代码,而且还提供了不能发送邮件的解决办法,你可以看这里温故知新。

而本文将带你较为详细的来剖析这一功能的实现。

一、了解wordpress发送邮件函数wp_mail

wp_mail函数是wordpress内置的邮件发送函数,基于php的mail()函数,因此需要你的主机有邮件发送功能,如果不支持mail函数,也可以使用wp-mail-smtp插件基本解决。

wp_mail函数用法

<?php?wp_mail(?$to,?$subject,?$message,?$headers,?$attachments?);??>

有五个参数,第一个是向哪个邮箱发送邮件,第二个是发送的邮件的标题,第三个是发送的内容。第四个是作为网页发送的邮件的网页头部信息,第五个是附件。例子如下

<?php $attachments = array(WP_CONTENT_DIR . '/uploads/file_to_attach.zip'); $headers = 'From: My Name <myname@mydomain.com>' . "rn"; wp_mail('test@test.com', 'subject', 'message', $headers, $attachments); ?>
<?php add_filter('wp_mail_content_type',create_function('', 'return "text/html";')); wp_mail('me@example.net', 'The subject', '<p>The <em>HTML</em> message</p>'); ?>

用法也很简单。更多的邮件发送功能,请参考php邮件发送函数。

二、判断在什么情况下发送邮件

在了解了我们可以用wordpress的wp_mail函数来向评论回复者发送邮件的之后,我们要判断在什么情况下发送这些邮件。

当一个新的用户对之前已经有的评论进行回复时,我们利用当前的回复动作进行邮件发送,我们先通过下面的一些判断,确定确实是要发送邮件,然后获取被回复那条评论的作者信息,向他的邮箱发送一条邮件信息。

1、管理员是否要接收邮件,管理员最好不要接收邮件,否则烦死你

$admin_notify = '0';//1为接收,0为不接收 $admin_email = get_bloginfo ('admin_email');//获取管理员的邮箱地址 $comment = get_comment($comment_id); $comment_author_email = trim($comment->comment_author_email);//获取当前评论者的邮件地址
if($comment_author_email == $admin_email && $admin_notify == '1')//如果当前评论者是管理员,而且你愿意接收邮件,那么我们做一个记号,以让你可以接收到邮件,这将在文章最后的全部代码中给出

2、判断这条评论是否有parent值,如果这条评论是回复上面的某条评论的话,应该是有该值的,这时才进行邮件发送

$parent_id = $comment->comment_parent ? $comment->comment_parent : '';//获取当前回复的是哪条评论(ID值) if($parent_id != '')//只有当这是在回复一条评论时才发送邮件

3、如果评论是垃圾评论,当然不要发送邮件

$spam_confirmed = $comment->comment_approved;//获取当前评论的状态,如果这条评论还是未被审核的评论,那么也不发送邮件;你需要注意的是,如果是一个新的访客,你在后台设置了,那么这条评论是需要审核的,评论没有被公布,被评论者自然收不到邮件 if($spam_confirmed != 'spam')//只有评论被公开了,才发送邮件

4、如果被回复的评论作者不勾选被评论时接收邮件,那么是不发送邮件的

(这里我们需要在comments表中增加一个字段,来记录之前的评论作者是否愿意接受邮件提示,而如果你希望所有用户都接受邮件,那么可以去除这一功能,并不给用户选择的余地。)

if($wpdb->query("Describe {$wpdb->comments} mail_to_comment") == '')$wpdb->query("ALTER TABLE {$wpdb->comments} ADD COLUMN mail_to_comment TINYINT NOT NULL DEFAULT 0;");// 在comments表中增加一个字段,用以保存是否已经发送了邮件的状态
if($comment_author_email != $admin_email && isset($_POST['mail_to_comment']))$wpdb->query("UPDATE {$wpdb->comments} SET mail_to_comment='1' WHERE comment_ID='$comment_id'");//如果接收到提交的内容用存在用户勾选了允许邮件提示的check框,那么将会把刚才增加的那个字段值设置为1,用在下面判断这条评论是否允许其他用户评论时邮件通知
$notify = $parent_id ? get_comment($parent_id)->mail_to_comment : '0';//判断评论是否能邮件通知的,由上一条得到 if($notify == '1')//只有当评论者允许接受邮件时才进行邮件发送

通过上面的判断,我们接下来可以发送邮件了。

三、发送邮件的内容

在发出的邮件中,你最好需要写一些不错的语句,尽量让用户能够返回你的网站进行新的互动。

$wp_email = 'no-reply@' . preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME'])); $to = trim(get_comment($parent_id)->comment_author_email); $subject = '您在 [' . get_option("blogname") . '] 的评论有了回复'; $message = '     <div style="background-color:#eef2fa; border:1px solid #d8e3e8; color:#111; padding:0 15px; -moz-border-radius:5px; -webkit-border-radius:5px; -khtml-border-radius:5px; border-radius:5px;">     <p>' . trim(get_comment($parent_id)->comment_author) . ', 您好!</p>     <p>您曾在《' . get_the_title($comment->comment_post_ID) . '》的评论: <br />'     . wpautop(get_comment($parent_id)->comment_content) . '</p>     <p>' . trim($comment->comment_author) . ' 给您的回复:<br />'     . wpautop($comment->comment_content) . '<br /></p>     <p>您可以点击 <a href="' . htmlspecialchars(get_comment_link($parent_id, array('type' => 'comment'))) . '">查看完整内容</a></p>     <p>欢迎再次光临 <a href="' . get_option('home') . '">' . get_option('blogname') . '</a></p>     <p>(此邮件由系统自动发出, 请勿回复.)</p>     </div>'; $from = "来自: "" . get_option('blogname') . "" <$wp_email>"; $headers = "$fromnContent-Type: text/html; charset=" . get_option('blog_charset') . "n"; wp_mail( $to, $subject, $message, $headers );

四、让你的博客拥有此功能

即使你将所有的代码增加到functions.php文件中,也需要一个勾子触发此事件,如果我们命名一个函数mail_to_comment来实现这一功能的话,你仍然需要增加下面的一个事件来实现当用户提交评论时触发函数,从而实现发送邮件

add_action('comment_post', 'mail_to_comment');

五、延伸:在评论框附近增加是否邮件通知的选项

在上文中第二点的第4种情况中,我们谈到了作为评论者是否愿意接收这种有人回复我的评论时得到邮件提示的功能,那么我们需要在我们的提交按钮附近增加一个复选框,让用户勾选它,从而可以记录用户的意愿。而上文中我们已经为comments表增加了一个字段,正是这个字段记录了用户的意向。

如果你自己设计评论列表和评论框,那么可以直接将这个复选框放在你的评论提交按钮附近即可,只要name值和上文中$_POST得到的值相同即可。

但如果你并没有设计自己的评论列表,那么你也可以通过勾子的方式增加一个复选框,代码如下:

function add_mail_to_comment_checkbox() {      echo '<label for="mail_to_comment"><input type="checkbox" name="mail_to_comment" id="mail_to_comment" value="mail_to_comment" checked="checked" style="margin-left:20px;" />有人回复时邮件通知我</label>'; } add_action('comment_form', 'add_mail_to_comment_checkbox');

经过frustigor的自己制作评论列表页面的经验发现,这个动作将发生在评论代码的<?php do_action(‘comment_form’, $post->ID); ?>地方,所以即使你自己设计自己的评论列表和复选框,也可以将<?php do_action(‘comment_form’, $post->ID); ?>放在你想要的位置,将上面的代码写入functions.php中,以此来实现增加一个复选框。

六、完整的代码

通过上述的讲解,或许你有了大概的思路了,但我还是将所有的代码都贴出来,以供大家参考。同时,我还加入了新的功能,即如果你发布了文章,同时也可以收到评论。这样我们就可以关闭后台的邮件评论通知了,因为wordpress的邮件通知无关信息太多。好吧,下面就是代码。

[payfor price="2"]/** * 本函数实现了在评论框附近添加是否需要在别人回复时邮件通知的功能 */  include_once(ABSPATH.'/wp-includes/pluggable.php');  function mail_to_comment($comment_id) { ?? ? ?? ?$comment = get_comment($comment_id); ?? ?$comment_author = $comment->comment_author; ?? ?$comment_author_url = $comment->comment_author_url ? '(Url:'.$comment->comment_author_url.')' : ''; ?? ?$comment_author_email = trim($comment->comment_author_email); ?? ?$comment_content = $comment->comment_content; ?? ? ?? ?$comment_parent_id = $comment->comment_parent; ?? ?$comment_parent = get_comment($comment_parent_id); ?? ?$comment_parent_link = get_comment_link($comment_parent_id,array('type' => 'comment')); ?? ? ?? ?$comment_post_id = $comment->comment_post_ID; ?? ?$comment_post_link = get_permalink($comment_post_id); ?? ?$comment_post = get_post($comment_post_id); ?? ?$comment_post_title = $comment_post->post_title; ?? ?$comment_post_author = get_userdata($comment_post->post_author); ?? ?$blogDomain = $_SERVER['SERVER_NAME']; ?? ?$blogName = get_bloginfo('name'); ?? ??? ? ?? ?if(isset($_POST['allow_mail_reply']) && $_POST['allow_mail_reply'] == 1){ ?? ??? ?update_comment_meta($comment_id,'allow_mail_reply',1) or add_comment_meta($comment_id,'allow_mail_reply',1,true); ?? ?} ?? ?$allow_mail_reply = get_comment_meta($comment_parent_id,'allow_mail_reply',true); ?? ?if(!$allow_mail_reply)$allow_mail_reply = 0; ?? ?if($comment_parent_id == 0)$allow_mail_reply = 1; ?? ? ?? ?// 0:不同意接收邮件提示;1:同意只要有邮件就提示; ?? ?if(!$allow_mail_reply || $comment->comment_approved == 'spam' || $comment->comment_type == 'pingback')return; ?? ? ?? ?if($comment_parent_id == 0) : ?? ??? ?$mail_to = trim($comment_post_author->user_email); ?? ??? ?$mail_content = "{$comment_post_author->display_name},您好!" ?? ??? ??? ?."n您的在{$blogName}上发表的文章“{$comment_post_title}”被{$comment_author}{$comment_author_url}评论,请及时回复他。" ?? ??? ??? ?."n链接:{$comment_post_link}" ?? ??? ??? ?."n内容:{$comment_content}"; ?? ?else : ?? ??? ?$mail_to = $comment_parent->comment_author_email; ?? ??? ?$mail_content = "{$comment_parent->comment_author},您好!" ?? ??? ??? ?."n您的在{$blogName}的文章“{$comment_post_title}”上发表的评论被{$comment_author}{$comment_author_url}回复,请及时回复他。" ?? ??? ??? ?."n链接:{$comment_parent_link}" ?? ??? ??? ?."n内容:{$comment_content}"; ?? ?endif; ?? ?$mail_subject = "您在“{$blogName}{$blogDomain}”有了新的评论动态"; ?? ?$mail_headers = "From: {$blogName} <no-reply@{$blogDomain}>rn"; ?? ? ?? ?wp_mail($mail_to,$mail_subject,$mail_content,$mail_headers); } add_action('comment_post','mail_to_comment');   function add_mail_to_comment_checkbox() { ? echo '<p id="add-mail-comment-checkbox"><label><input type="checkbox" name="allow_mail_reply" value="1" checked="checked" />有人回复时邮件通知我</label></p>'; } add_action('comment_form', 'add_mail_to_comment_checkbox');  // -- END ----------------------------------------[/payfor]

七、存在的一些问题

1、一条评论只能接受一条邮件提示,然而有时候一条评论会有多条回复来进行回复,那么只有第一条回复的内容能被显示在邮件中,其实我们希望不同的用户对一条评论进行回复时,被回复者都能收到起码一条他们之间的讨论邮件。

2、当新的访客进行回复时,开始是没有被审核的,当管理员在后台进行审核时,post_comment的action已经不生效了,也就说这条被审核的回复对应的被评论者并不能在它被审核时收到邮件提示(待证)。

3、更多的情况有待大家思考

分类
WordPress

wordpress中文章发布时间不显示?用get_the_date代替the_date

今天发现,在主题中部分地方使用the_date函数来显示文章发布的时间时,竟然发生不显示时间的情况,再仔细看了一下这些文章,有些都是经过几次修改和保存的,可能是由于the_date只是显示文章第一次发布时的时间,于是我用echo get_the_date来替换它,就轻松吧问题解决了。由于没有仔细去看数据库和函数源代码,原因暂时无从得知。

分类
WordPress

wordpress中有关即时验证的几个_nonce函数

在wordpress中,为了增加系统的验证安全性,内置了一些简单的验证,这些验证可以有效的防治注册、提交等操作,如果开发者在主题开发中,对数据库进行了操作,一定要使用到这些函数,本文就对这几个函数做一个详细的介绍。

一、wp_create_nonce

wp_create_nonce的用法很简单,即一般用在链接中

它将有一个参数,这个参数相当于一个唯一标识ID,通过这个ID,你可以再后文的程序中进行检查。它的返回值即nonce,一个随机字符串。

wp_create_nonce(?$action?);

它的使用例如:

<?php?$nonce=?wp_create_nonce??('my-nonce');??>
<a?href='myplugin.php?_wpnonce=<?php?echo?$nonce??>'>?...

<?php
$nonce=$_REQUEST[‘_wpnonce’];
if?(!?wp_verify_nonce($nonce,?’my-nonce’)?)?die(‘Security?check’);
?>

它是一个创建即时的随机字符串的函数,在wordpress系统中,增加了对这个字符串的检查,及wp_verify_nonce,当然如果使用的默认值,也可以用check_admin_referer来验证。这将在后文中讲到。

wp_nonce_url()能直接转换一个链接地址为带_wpnonce参数的地址,例如wp_nonce_url(‘admin.php’)就变成了admin.php?_wpnonce=98fa9dgf

二、wp_nonce_field

和wp_create_nonce一样,也是一个创建nonce的函数,但不同的是,它创建的是一个完整的<input>并且已经打印出来,所以我们只需要将它放在<form>中间即可,下面有例子。

它有四个参数,第一个参数和上文中提到的唯一标识ID的一个意思,第二个参数的创建出来的input的name属性值,默认为_wpnonce,第三个参数用来设置该input是否为一个要用以确认是否进行检索,默认为true,第四个参数是用来设置是否打印出来,如果打印出来,则生成一个input,默认是true,即打印出来。如果将$echo和$referer都设为true,需要检索wp_referer_field()。如果将$referer设为true且回应随机字段,那么它也会回应referer字段。一般情况下,我们不用后面两个参数。

<?php?wp_nonce_field(?$action,?$name,?$referer,?$echo?)??>

它的使用例子如下:

<form method=”post”>
<!– some inputs here … –>
<?php wp_nonce_field(‘name_of_my_action’,’name_of_nonce_field’);??>
</form>
<?php
if ( empty($_POST) ||?!wp_verify_nonce($_POST[‘name_of_nonce_field’],’name_of_my_action’) )
{
print ‘Sorry, your nonce did not verify.’;
exit;
}
else
{
// process form data
}

当然,你也可以用check_admin_referer来验证。

三、wp_referer_field

为表格检索或显示引用页隐藏字段。

引用页链接即来自服务器超级全局变量的当前请求URI。如果希望手动检索,请使用输入名称’_wp_http_referer’。

<?php?wp_referer_field(?$echo?)??>

它有一个参数,用来确认是否打印出来。这个函数我们基本不用,所以官方没有例子。

四、wp_verify_nonce

这是一个检查nonce的函数,检查返回true or false。正如上文中的例子一样,它完成对特地唯一标识ID的检查,如果不是本次请求产生的nonce,则返回false,例如别人提交了一个nonce过来,它返回false。

<?php?wp_verify_nonce(?$nonce,?$action?);??>

它有两个参数,第一个是接收到的nonce,如果我们用wp_create_nonce创建一个_wpnonce,那么我们接收它,一般以$_GET[‘_wpnonce’]或$_POST[‘_wpnonce’]的形式获得,当然wp_nonce_field创建的也是同样的道理。第二个参数则是那个对应的唯一标识ID,例如上文中的my-nonce。实例如:

$nonce=$_REQUEST[‘_wpnonce’];
if?(!?wp_verify_nonce($nonce,?’my-nonce’)?)?die(‘Security?check’);

它只是返回ture or false,并不阻断程序的运行,如果要阻断,需要自己的添加wp_die()函数来阻断。

五、check_admin_referer

它有两个参数,第一个对应那个唯一标识ID,第二个对应发送过来的nonce,也就是说这两个参数和wp_verify_nonce的正好相反。

它和wp_verify_nonce有着本质的不同,它不仅要进行nonce的检查,而且要判断问题和错误原因,如果错误是存在的,还要阻断程序执行,给出被阻断的原因。例如我们提交一个空的评论框的时候,我们会看到一个提示界面,这个界面是由wp_die()产生的,如果我们的nonce检查发生错误,check_admin_referer也会产生同样的效果。

例子如下:

<form method=”post”>
<!– some inputs here … –>
<?php wp_nonce_field( ‘name_of_my_action’,’name_of_nonce_field’ );??>
</form>
<?php
// if this fails, check_admin_referer() will automatically print a “failed” page and die.
if (?!empty($_POST) && check_admin_referer( ‘name_of_my_action’, ‘name_of_nonce_field’ ) ) {
// process form data, e.g. update fields
}
// Display the form

这样我们就可以防止一些恶意的操作。

六、什么时候要用nonce检查,使用哪一个函数

1、当你的操作需要进行数据库的操作,涉及到权限问题时,最好先进行检查,虽然这个验证并不是非常可靠的,但是已经可以防止从站外进行数据提交了。你可以想想,当一个用户直接在地址栏里面打上一些命令,就可以对你的数据库进行操作,这是多么可怕的一件事,但是你在地址中增加一个_wpnonce或其他什么参数,这个参数的值是一个nonce,而程序的执行必须先进行这个nonce检查,那么不就安全多了么。别人虽然可以再地址栏里面打出这个参数,甚至有可能猜对这个参数的值,但是如果wordpress发现这个值不是通过系统本身产生的,仍然会无法通过检查。

2、当你想为某个链接地址创建一个nonce的时候,可以选择用wp_creat_nonce或wp_nonce_url,你可以轻松的创建一个带有nonce的链接,用户点击链接时可以自然产生这个nonce。而一般这种通过$_GET[]方式创建的nonce,都用wp_verify_nonce来检查,它们或许是一套的。

3、一般选择用wp_nonce_field来创建一个隐藏的input,通过$_POST[]的方式进行获取,然后用check_admin_referer进行检查,因为check_admin_referer并不能直接检查nonce值,即$_POST[]的内容,所以也不能检查wp_creat_nonce产生的地址连接,当然,你可以巧妙的变化,自己写一个<input type=”hidden” name=”_wpnonce” value=”<?php echo wp_creat_nonce(‘my-nonce’); ?>”>,然后用post的方式提交,用check_admin_referer(‘my-nonce’,’_wpnonce’)进行检查。

其实你只需要了解各个函数之间产生的效果即可,只要在检查的时候,能让nonce生效即可,了解这些之后,即可以为你的程序增加更多的权限判断,以免造成一些安全隐患。

分类
WordPress

使用add_rewrite_rule()为wordpress增加路由地址

在wordpress中,我们渴望为我们的博客增加一些我们想要的地址,让博客地址更容易被记住或看起来更友好更专业。而add_rewrite_rule()函数正为我们提供了这个功能,然而要真正实现wordpress的路由,还确实有点麻烦,本文较为详细的给大家介绍这一过程。

一、理清思路,你要做什么

或许你读过笔者的《为你的wordpress更换/login的友好登陆地址》一文,文章中实现了让login代替wp-login.php,让登陆地址比较友好,然而文章中使用了.htaccess文件来实现最后的路由,本文就让你抛弃.htaccess,实现真正的wordpress路由。

二、了解add_rewrite_rule函数

进入官方的API文档页面了解该函数的基本用法。我们学着为wordpress增加login的路由,经笔者多次尝试,最终确定如下:

add_rewrite_rule(‘^login?([^/]*)’,’wp-login.php?$matches[1]’,’top’);

我也不知道为什么,修改?的位置或去掉,都不会成功。

三、一定要在后台在更新一次固定链接

想要实现login的效果,前提条件是你已经使用了固定链接,让.htaccess生效。在这个前提下,wordpress重新路由的功能才能起效。为什么一定要再更新一次固定链接呢?.htaccess并没有发生变化啊?这是因为所有新增的路由规则都是记录在数据库中的,请看这篇文章

四、终结版代码

add_filter(‘wp_redirect’, ‘login_url’);
add_filter(‘network_site_url’,’login_url’);
add_filter(‘site_url’,’login_url’);

function login_url($url)
{
$old? = array( “/(wp-login.php)/”);
$new? = array( “login”);
return preg_replace( $old, $new, $url, 1);
}

add_rewrite_rule(‘^login?([^/]*)’,’wp-login.php?$matches[1]’,’top’);

将上面的代码放在functions.php文件中,上传后,到后台更新一次固定链接,OK!

分类
WordPress

wordpress中对已经登录用户的权限、管理级别的判断

在wordpress后台中,我们可以看到用户有“订阅者、投稿者、作者、编辑、管理员”五个组别,他们的权限不同能进行的操作也自然不同,我们在对wordpress用户的权限进行判断的时候,最主要的依据及这五个组别,那么怎么判断当前登录用户是属于什么组别,拥有什么权限呢?

1、用户组别权限一览表:

wordpress中对已经登录用户的权限、管理级别的判断

从上表中,我们可以发现对应的用户组所拥有的权限。那么怎么去判断用户的权限呢?或许你已经发现了,就是user_level,在数据库中,这个值被放在usermeta表中。这个值可以用get_userdata(get_current_user_id())或get_usermeta(get_current_user_id()),将他们的值放在$current_user中,再$current_user->user_level即可获得。

2、current_user_can()函数来判断用户是否有某权限

该函数参数即为上表中的某个字段,例如current_user_can(‘upload files’)来判断用户是否有上传文件的权限。

那么怎么判断这个用户是什么权限呢,把参数换为level_10即可,对应的权限表如下:

看如下图表

Capability Administrator Editor Author Contributor Subscriber
level_10
level_9
level_8
level_7
level_6
level_5
level_4
level_3
level_2
level_1
level_0

这个图表展示了WordPress各个用户组所对应的级别,那么我们需要来判断是否为管理员,也就是Administrator。

用法如下:

if(current_user_can(‘level_10’)){
//加入符合管理员后需要添加的内容
}

这样,你基本能解决wordpress中所有用户权限的问题了。

可能需要用到的函数:

get_userdata()

get_current_user_id()//获取当前登录用户的ID

get_user_meta()

wp_get_current_user()

分类
WordPress

如何对WordPress主题实现多语言化支持之简单教程

如果你是一个WordPress主题制作爱好者,当然会希望自己制件的主题能更受欢迎,一个很重要的方法是让你制作的主题能够实现对中文之外更多语言的支持。而这一篇文章是说一下怎样让WordPress的主题实现语言的本地化。

(接下来的例子我以主题Js O4w作例)

首先你需要在主题文件中添加本地化支持语句,把下面的代码添加到你主题中的function.php文件中去:

function theme_init(){
load_theme_textdomain('js-o4w', get_template_directory() . '/languages');
}

上面的代码中红色字段随意,它是用来告诉WordPress如何选择那些能本地化语言的代码,一般来说,填个主题的名字就可以了。而绿色的字段是告诉WordPress本地化语言文件的调用路径,一般就是那样写的,大可以不用改变。

有了上面代码的设置后,大家就着手定义一下在主题文件中究竟那些字段需要支持语言的本地化,我这里以侧栏中的一句标题代码作例。在还没有支持语言本地化时候,代码是这样的:

<h2>Most Popular</h2>

因为我希望对上面红色字段Most Popular修改到支持本地化,我只要把代码修改成如下:

<h2><?php _e('Most Popular', 'js-o4w'); ?></h2>

大家能看到修改的内容了吧,再举一例,比如我在footer信息中的一段代码:

<span>Copyright 2009</span>

我要把红色的字段copyright修改到支持本地化,修改代码如下:

<span><?php _e('Copyright', 'js-o4w'); ?> 2009</span>

相信到此大家就很了解是如何修改主题中显示字符段的代码了,注意的上面两句代码中都带有的标识字段:

js-o4w

它就是用来对应在文章最开头那段代码中我说的随意那部分,它们之间是要对应的。然后大家把需要修改的都修改后,那接下来怎样对这些需要本地化的字段进行翻译呢?我们继续说下去。

接着要去下载一个Poedit这个编辑工具。然后我们需要在主题的目录中新建一个文件夹,因为我们需要在这个文件夹中放置翻译好供系统读取的文件,根据本文开端代码中的绿色字段部分,我们这个文件夹的名字是:languages

下一步利用Poedit新建一个“消息目录文档”,如下图:

如何对WordPress主题实现多语言化支持之简单教程

然后它需要我们对这个文档初始设置一下。

如何对WordPress主题实现多语言化支持之简单教程

(上图)本例我需要把上面的英文字段翻译成中文的,所以在设置的“工程信息”一栏中我是这样填写的,这些填写都不是很重要,就是一些记录信息之类的,不影响翻译操作。

如何对WordPress主题实现多语言化支持之简单教程

(上图)接着要填写的是第二个标签页“路径”。这一步很重要,请按图中的填写。因为它将会告诉这个软件从何处获取需要翻译的字段。

如何对WordPress主题实现多语言化支持之简单教程

(上图)第三个标签页是用来决定自动获取需要翻译字段的关键字。就是告诉软件,当代码中出现什么的字时候,确定它为要翻译的字段而选择出来。大家按上图填写就好了,是不是发现上面的“_e”在较早我所说的例子代码里都存在啊,大家明白了吧。

当大家按上面的设置好之后,记得把文件存放在较早前新建的目录languages内,因为这是简体中文的翻译,所以文件名是zh_CN,后缀名是.po

接下来点击一下软件中的第三个图标(如下图红色标记处)。哗啦哗啦的软件就把我们主题文件中所有合符要求的需要翻译的字段列举出来了,很效率吧。

如何对WordPress主题实现多语言化支持之简单教程

如下图,工具显示两栏,左侧为需要翻译的字段,右侧是译文。当还没有翻译的字段的右侧是留空的,如图中的“Read more”。

如何对WordPress主题实现多语言化支持之简单教程

我们点击下需要翻译的字段,然后在最下面一栏填写翻译的内容就行了。大家就这样把需要翻译的字段一个一个翻译完吧,耐心点。

当所有需要翻译的字段都完成后,点击如下图的红色按钮。软件会把当前的编译文件zh_CN.po进行保存并且同时在该文件的的有目录中生成一个文件名相同但后缀名是.mo的文件。

如何对WordPress主题实现多语言化支持之简单教程

因为后缀名是.po的文件我们是可以进行编译操作的,文件名是.mo的则是不能进行编译,但它却是系统需要读取的文件。所以请务必日后在每次更改了.po文件后,都重复一下上面的这个步骤,更新一下对应的.mo文件。

如何对WordPress主题实现多语言化支持之简单教程

基本的操作就是这样的了,大家翻译好简体中文的,就翻译其它语言的吧。所有的步骤都与上面所说的相同,只是翻译的内容不同罢了。相信大家会举一反三的。

那么再多说一句,WordPress是怎样知道该读取哪个语言文件呢?其实就是在它的wp-config.php文件中,不是有下面的这样一句?

define ('WPLANG', 'zh_CN');

注意红色部分。哦~,此时相信大家都知道了。

文章来自:http://www.saywp.com/wordpress/make-your-wordpress-theme-translatable.html