WordPress 投稿功能(非插件/免注册/邮件通知站长和投稿人)

时间: 2013-03-28 / 分类: WordPress, 网站建设 / 浏览次数: 850 views / 47个评论 发表评论

如果你的网站有一定的流量,完全可以开放投稿功能,不仅保证文章的更新,而且增强了与访客的互动。实现用户投稿,常见的有两种方法:

方法一:开放后台的注册功能,普通用户注册进去默认设置为投稿者,登陆进去即可添加文章(默认为草稿)。

方法二:在前台提供投稿表单,用户填写相应的表格即可。

方法一实现起来比较简单,基本不需要博主配置太多东西,只是有些博主可能会觉得别扭,不愿让他人看到自己的博客后台;而方法二对投稿者来说方便了很多,博主也不用担心自己博客的后台隐私,只是该方法实现起来比较麻烦,需要配置的东西很多。

好了,其实这个过程不复杂,仅需三步就可以啦!当然也只是复制粘贴代码就可以了。

第一步:添加投稿表单

1、首先在当前主题的目录下新建一个php文件,命名为tougao-page.php,然后将page.php中的所有代码复制到tougao-page.php中;

2、删除tougao-page.php开头的所有注释,即 /* 与 */ ,以及它们之间的所有内容;

3、将 <?php the_content(); ?> 改成以下代码:

<?php the_content(); ?>

<!-- 关于表单样式,请自行调整-->
<form method="post" action="<?php echo $_SERVER["REQUEST_URI"]; ?>">
    <div style="text-align: left; padding-top: 10px;">
        <input type="text" size="40" value="" id="tougao_authorname" name="tougao_authorname" />
        <label for="tougao_authorname">昵称*</label>
    </div>

    <div style="text-align: left; padding-top: 10px;">
        <input type="text" size="40" value="" id="tougao_authoremail" name="tougao_authoremail" />
        <label for="tougao_authoremail">邮箱*</label>
    </div>

    <div style="text-align: left; padding-top: 10px;">
        <input type="text" size="40" value="" id="tougao_authorblog" name="tougao_authorblog" />
        <label for="tougao_authorblog">您的博客/文章来源</label>
    </div>

    <div style="text-align: left; padding-top: 10px;">
        <input type="text" size="40" value="" id="tougao_title" name="tougao_title" />
        <label for="tougao_title">文章标题*</label>
    </div>

    <div style="text-align: left; padding-top: 10px;">
        <?php wp_dropdown_categories('show_option_none=请选择文章分类&id=tougao-cat&show_count=1&hierarchical=1&hide_empty=0'); ?>
        <label for="tougaocategorg">文章分类*</label>
    </div>

    <div style="text-align: left; padding-top: 10px;">
        <textarea rows="15" cols="55" id="tougao_content" name="tougao_content"></textarea>
    </div>

    <br clear="all">
    <div style="text-align: center; padding-top: 10px;">
        <input type="hidden" value="send" name="tougao_form" />
        <input type="submit" value="提交" />
        <input type="reset" value="重填" />
    </div>
</form>

二、添加表单处理代码

在tougao-page.php开头处中,将第一个 <?php 改成:

<?php
/**
 * Template Name: tougao
 * 作者:露兜
 * 博客:http://www.ludou.org/
 *
 * 更新记录
 *  2010年09月09日 :
 *  首个版本发布
 *
 *  2011年03月17日 :
 *  修正时间戳函数,使用wp函数current_time('timestamp')替代time()
 *
 *  2011年04月12日 :
 *  修改了wp_die函数调用,使用合适的页面title
 */

if( isset($_POST['tougao_form']) && $_POST['tougao_form'] == 'send')
{
    global $wpdb;
    $last_post = $wpdb->get_var("SELECT post_date FROM $wpdb->posts WHERE post_type = 'post' ORDER BY post_date DESC LIMIT 1");

    // 博客当前最新文章发布时间与要投稿的文章至少间隔120秒。
    // 可自行修改时间间隔,修改下面代码中的120即可
    // 相比Cookie来验证两次投稿的时间差,读数据库的方式更加安全
    if ( current_time('timestamp') - strtotime($last_post) < 120 )
    {
        wp_die('您投稿也太勤快了吧,先歇会儿!');
    }

    // 表单变量初始化
    $name = isset( $_POST['tougao_authorname'] ) ? trim(htmlspecialchars($_POST['tougao_authorname'], ENT_QUOTES)) : '';
    $email =  isset( $_POST['tougao_authoremail'] ) ? trim(htmlspecialchars($_POST['tougao_authoremail'], ENT_QUOTES)) : '';
    $blog =  isset( $_POST['tougao_authorblog'] ) ? trim(htmlspecialchars($_POST['tougao_authorblog'], ENT_QUOTES)) : '';
    $title =  isset( $_POST['tougao_title'] ) ? trim(htmlspecialchars($_POST['tougao_title'], ENT_QUOTES)) : '';
    $category =  isset( $_POST['cat'] ) ? (int)$_POST['cat'] : 0;
    $content =  isset( $_POST['tougao_content'] ) ? trim(htmlspecialchars($_POST['tougao_content'], ENT_QUOTES)) : '';

    // 表单项数据验证
    if ( empty($name) || mb_strlen($name) > 20 )
    {
        wp_die('昵称必须填写,且长度不得超过20字');
    }

    if ( empty($email) || strlen($email) > 60 || !preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $email))
    {
        wp_die('Email必须填写,且长度不得超过60字,必须符合Email格式');
    }

    if ( empty($title) || mb_strlen($title) > 100 )
    {
        wp_die('标题必须填写,且长度不得超过100字');
    }

    if ( empty($content) || mb_strlen($content) > 3000 || mb_strlen($content) < 100)
    {
        wp_die('内容必须填写,且长度不得超过3000字,不得少于100字');
    }

    $post_content = '昵称: '.$name.'<br />Email: '.$email.'<br />blog: '.$blog.'<br />内容:<br />'.$content;

    $tougao = array(
        'post_title' => $title,
        'post_content' => $post_content,
        'post_category' => array($category)
    );

    // 将文章插入数据库
    $status = wp_insert_post( $tougao );

    if ($status != 0)
    {
        // 投稿成功给博主发送邮件
        // somebody#example.com替换博主邮箱
        // My subject替换为邮件标题,content替换为邮件内容
        wp_mail("somebody#example.com","My subject","content");

        wp_die('投稿成功!您的文章将在审核通过后发布!','投稿成功!');
    }
    else
    {
        wp_die('投稿失败!');
    }
}

最后以UTF-8编码保存tougao-page.php,否则中文可能会乱码。

代码补充说明(可以不用看)

1、请注意修改第二段代码的77行中的邮件信息,如果上面的代码没办法正常发送邮件,可以将第77行代码

 wp_mail("somebody#example.com","My subject","content");

修改为

mail("somebody#example.com","My subject","content");

实现该功能要你的主机空间支持mail()函数!
如果你希望站长审核文章后,自动发邮件通知投稿人,你可以在第二段代码的 78 行插入:

//将投稿者邮箱写入数据库
add_post_meta($status, 'tougao_authoremail', $email , TRUE);

然后在functions.php文件中添加:

function tougao_notify($mypost) {
    $email = get_post_meta($mypost->ID, "tougao_authoremail", true);

    if( !empty($email) ) {
        // 以下是邮件标题
        $subject = '您在 '. get_option('blogname') .' 的投稿已发布';
        // 以下是邮件内容
        $message = '
        <p><strong>'. get_option('blogname') .'</strong> 提醒您: 您投递的文章 <strong>' . $mypost->post_title . '</strong> 已发布</p>

        <p>您可以点击以下链接查看具体内容:<br />
        <a href="' . get_permalink( $mypost->ID ) . '" target="_blank">点此查看完整內容</a></p>
        <p>感谢您对 <a href="'. get_option('home') .'" target="_blank">'. get_option('blogname') .'</a> 的关注和支持</p>
        <p><strong>该信件由系统自动发出, 请勿回复, 谢谢.</strong></p>';

        add_filter('wp_mail_content_type',create_function('', 'return "text/html";'));
        @wp_mail( $email, $subject, $message );
    }
}

add_action('draft_to_publish', 'tougao_notify', 6);

注意:需要你的主机空间支持mail()函数!

3、如果你想让投稿的文章立即发布,而不需要审核再编辑,那么请将以上代码64行改成:

'post_content' => $post_content, 'post_status' => 'publish',

4、如果你想让用户在投稿的同时,将投稿者注册成你本站的投稿者,并将文章的作者归到这个投稿者的名下,你可以将第二段代码中的:

// 将文章插入数据库
$status = wp_insert_post( $tougao );

改为:

require_once(ABSPATH . WPINC . '/registration.php');
$user_id = username_exists( $name );
if(!$user_id) {
    if(mb_strlen($name,"utf-8") != strlen($name) || email_exists($email))
        wp_die('用户名含有非英文字符,或者Email已被注册!');
    $password = '123456'; // 默认的用户密码,自行更改
    $user_id = wp_create_user( $name, $password, $email );
    // 更新用户的网站和角色,角色默认为投稿者contributor,
    // 角色可改成订阅者:subscriber,作者:author
    wp_update_user( array ('ID' => $user_id, 'user_url' => $blog, 'role' => 'contributor' ) ) ;
}
// 建立文章与作者关系
$tougao['post_author'] = $user_id;

// 将文章插入数据库
$status = wp_insert_post( $tougao );

5、如果你的博客文章都有自定义栏目,并且想在用户投稿的同时添加自定义栏目,可以参考一下内容。

这里只介绍添加“歌手”自定义栏目的方法,更多自定义栏目,自行参考:

(1)在第一段代码24行添加表单域:

<div style="text-align: left; padding-top: 10px;">
<label for="tougao_geshou">歌手:*</label>
<input type="text" size="40" value="" id="tougao_geshou" name="tougao_geshou" />
</div>

(2)在第二段代码中38行添加初始化代码:

$geshou = isset( $_POST['tougao_geshou'] ) ? trim(htmlspecialchars($_POST['tougao_geshou'], ENT_QUOTES)) : '';

(3)第二段代码第78行添加代码,给文章附加歌手自定义字段:

add_post_meta($status, 'geshou', $geshou,TRUE); // 其中geshou是自定义栏目的名称

6、如果你使用了一些富文本编辑器,文章提交后内容中的代码都被转义了,可以将第二段代码37行换成:

$content = isset( $_POST['tougao_content'] ) ? $_POST['tougao_content'] : '';

7、如果你想让投稿者自己填写文章的标签。请按照下面的提示操作:
第一段代码24行插入:

<div style="text-align: left; padding-top: 10px;">
<label>文章标签(多个用半角逗号隔开):</label>
</div>
<div>
<input type="text" size="40" value="" name="tougao_tags" />
</div>

第二段代码38行插入:

$tags = isset( $_POST['tougao_tags'] ) ? $_POST['tougao_tags'] : '';
64行
1'post_content' => $post_content,

改成:

'post_content' => $post_content,
'tags_input' => $tags,

最后进入WordPress管理后台 – 页面 – 创建页面,标题为投稿(可以自己起名),内容填上投稿说明等,右侧可以选择模板,选择 tougao 即可。

好了,基本的投稿功能已经添加完毕,至于表单样式不好看,表单缺少你想要的项目等问题,你就自己添加css、表单项吧。

本文原文来自http://www.cmhello.com/wordpress-add-contribute-page.html



.

*******************************************************************

上面是广告! 真的是广告!! 真的真的啊!!!

-----------------------------------------------------Copyright © 2011-2012--浙ICP备12011997---------------------------- ---------------------- ------------------------

无觅相关文章插件,快速提升流量