文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

wordpress 为主题添加AJAX提交评论功能的php代码

2022-06-12 02:02

关注

首先需要在主题的function.php文件里添加一段函数:


复制代码代码如下:

< ?php

function fail($s) {

header('HTTP/1.0 500 Internal Server Error');

echo $s;

exit;

}

function ajax_comment(){

if($_POST['action'] == 'ajax_comment') {

global $wpdb, $db_check;

// Check DB

if(!$wpdb->dbh) {

echo('Our database has issues. Try again later.');

die();

}

nocache_headers();

$comment_post_ID = (int) $_POST['comment_post_ID'];

$status = $wpdb->get_row("SELECT post_status, comment_status FROM $wpdb->posts WHERE ID = '$comment_post_ID'");

if ( empty($status->comment_status) ) {

do_action('comment_id_not_found', $comment_post_ID);

fail('The post you are trying to comment on does not currently exist in the database.');

} elseif ( 'closed' == $status->comment_status ) {

do_action('comment_closed', $comment_post_ID);

fail('Sorry, comments are closed for this item.');

} elseif ( in_array($status->post_status, array('draft', 'pending') ) ) {

do_action('comment_on_draft', $comment_post_ID);

fail('The post you are trying to comment on has not been published.');

}

$comment_author = trim(strip_tags($_POST['author']));

$comment_author_email = trim($_POST['email']);

$comment_author_url = trim($_POST['url']);

$comment_content = trim($_POST['comment']);

// If the user is logged in

$user = wp_get_current_user();

if ( $user->ID ) {

$comment_author = $wpdb->escape($user->display_name);

$comment_author_email = $wpdb->escape($user->user_email);

$comment_author_url = $wpdb->escape($user->user_url);

if ( current_user_can('unfiltered_html') ) {

if ( wp_create_nonce('unfiltered-html-comment_' . $comment_post_ID) != $_POST['_wp_unfiltered_html_comment'] ) {

kses_remove_filters(); // start with a clean slate

kses_init_filters(); // set up the filters

}

}

} else {

if ( get_option('comment_registration') )

fail('Sorry, you must be logged in to post a comment.');

}

$comment_type = '';

if ( get_option('require_name_email') && !$user->ID ) {

if ( 6> strlen($comment_author_email) || '' == $comment_author )

fail('Sorry: please fill the required fields (name, email).');

elseif ( !is_email($comment_author_email))

fail('Sorry: please enter a valid email address.');

}

if ( '' == $comment_content )

fail('Sorry: please type a comment.');

// Simple duplicate check

$dupe = "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = '$comment_post_ID' AND ( comment_author = '$comment_author' ";

if ( $comment_author_email ) $dupe .= "OR comment_author_email = '$comment_author_email' ";

$dupe .= ") AND comment_content = '$comment_content' LIMIT 1";

if ( $wpdb->get_var($dupe) ) {

fail('Duplicate comment detected; it looks as though you\'ve already said that!');

}

$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'user_ID');

if( !$user->ID ){

$result_set = $wpdb->get_results("SELECT display_name, user_email FROM $wpdb->users WHERE display_name = '" . $comment_author . "' OR user_email = '" . $comment_author_email . "'");

if ($result_set) {

if ($result_set[0]->display_name == $comment_author){

fail( __('Error: you are not allowed to use the nickname that you entered.if you are the administrator you hava to login to comment.','philna2') );

} else {

fail( __('Error: you are not allowed to use the email that you entered.if you are the administrator you hava to login to comment.','philna2') );

}

}

}

$comment_id = wp_new_comment( $commentdata );

$comment = get_comment($comment_id);

if( !$user->ID ){

setcookie('comment_author_' . COOKIEHASH, $comment->comment_author, time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);

setcookie('comment_author_email_' . COOKIEHASH, $comment->comment_author_email, time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);

setcookie('comment_author_url_' . COOKIEHASH, clean_url($comment->comment_author_url), time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);

}

@header('Content-type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));

?>

//这里需要粘贴你的评论框架代码,不过相关的调用代码有所变化:

//评论ID:$comment->comment_ID

//评论者名字:$comment->comment_author

//判断评论者是否填写了网站地址:$comment->get_comment_author_url

//评论者URL:$comment->comment_author_url

//评论时间:mysql2date(__('F js, Y'),$comment->comment_date)

//评论者e-mail:$comment->comment_author_email

//评论内容$comment->comment_content

< ?php

die();

}

}

add_action('init', 'ajax_comment');

//添加AJAX评论钩子

?>

如果处理评论内容里的换行符的话,$comment->comment_content需做以下处理:


复制代码代码如下:

< ?php

$aj_order = array("\r\n", "\n", "\r");

$aj_comment_content = str_replace($aj_order,'

',$comment->comment_content);

echo $aj_comment_content;

?>

用jquery写提交评论时的脚本,这也是关键的部分:


复制代码代码如下:

jQuery(document).ready(function() {

if (jQuery('#commentform').length) {

jQuery('#commentform').submit(function(){ //ID为 commentform 的表单提交时发生的函数,也就是整个留言输入框 form 的ID。

var ajaxCommentsURL = window.location.href;

jQuery.ajax({

url: ajaxCommentsURL,

data: jQuery('#commentform').serialize()+'&action=ajax_comment',

type: 'POST',

beforeSend: function() {

jQuery('#commenterror').hide();

var submit='<div id="commentload" style="display: none;background: url("img/spinner.gif") no-repeat scroll 0 50%;margin: 0 auto;">Submitting Comment...</div>'; //创建名为 submit 的字符串,稍后插入,这里的样式大家自己根据需要定义,那个背景图片自己去下哈。

var error='<div id="commenterror" style="display: none;margin: 0 auto;">Posted comment fail.</div>'; //创建名为 error 的字符串

jQuery('#comments').after(submit); // 在ID为 comments 的元素后插入刚定义的 submit

jQuery('#comments').after(error); // 同样插入刚定义的 error

jQuery('#commentload').slideDown(); // 让submit 向下滑出

},

error: function(request) { //发生错误时

jQuery('#commentload').hide(); //隐藏 submit

jQuery('#commenterror').show("slow").html(request.responseText); //显示 error

},

success: function(data) {

jQuery('textarea').each(function(){

this.value='';

});

jQuery('#commenterror').hide().html();

if (!jQuery('#thecomments').length) {

jQuery('#pinglist').before('<ol id="thecomments"></ol>');}

jQuery('#thecomments').append(data); //向ID为 thecomments 的元素添加数据,也就是整个 ol 或 ul

var new_comment = jQuery('#thecomments li:last').hide(); //让最新添加的数据隐藏

new_comment.slideDown(1000); //再显示,这里是为了实现滑出的效果,不想要也可以直接显示

jQuery('#commentform:input').attr('disabled', true);

jQuery('#commentload').slideUp("slow");

jQuery('#messagebox').slideUp("slow"); //这是针对我模版而加的,因为我模版在没有留言时会有个 nocomment 的元素,我要让添加一条留言后他自动隐藏,要不然会矛盾,呵呵,这个可以自行选择要或不要

setTimeout(function() {

jQuery('#commentform:input').removeAttr('disabled');

}, 10000); //这里是设置10秒之后才可以再次留言,自行设置,单位毫秒。

}

});

return false;

} );

}})

注意:

脚本里的对象ID要对应主题里的评论相关框架的ID。

后续步骤:

为commentload,commenterror写css。

有待完善的地方:

AJAX提交后的评论序号显示为1。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-开源
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯