WordPress 에서 AJAX 기술 을 이용 하여 평론 제출 의 실현 예
직접 단도직입적으로 코드 에 올 라 갑 니 다. (원리 와 사고방식 은 마지막 에 있 습 니 다) 자신의 주제 에 따라 구조 가 다 르 기 때문에 다음 코드 는 스스로 조정 하 십시오.
WordPress Ajax 는 테마 function. php 파일 에 다음 부분 을 추가 합 니 다.
// yinheli , 、 。
//yinheli , 。
//Edited by XiangZi DEC.17TH 2011
function fail($s) {//
header('HTTP/1.0 500 Internal Server Error');
echo $s;
exit;
}
function ajax_post_comment_slow (){
fail(' ? !');
}
// 。
add_filter('comment_flood_trigger','ajax_post_comment_slow', 0);
// ,
function ajax_comment(){
// Ajax php
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) ) {
// wp 。 :include/comment.php
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(' ? ?');
}
$comment_type = '';
if ( get_option('require_name_email') && !$user->ID ) {
if ( 6> strlen($comment_author_email) || '' == $comment_author )
fail('Oopps, [Name] [email] 。');
elseif ( !is_email($comment_author_email))
fail('Oopps, [Email] 。');
}
if ( '' == $comment_content )
fail(' ?');
// 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(' ! !');
}
$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(' ?');
} else {
fail(' ?');
}
}
}
$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'));
xz_comment($comment, null);// , 。
die();
}
}
add_action('init', 'ajax_comment');
자바 script 에서 코드 주의: 다음 코드 는 Jquery 프레임 워 크 지원 이 필요 합 니 다.javascript onload 코드 에 다음 부분 을 추가 합 니 다.
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();
jQuery('#commentload').fadeIn();
},
error: function(request) { //
jQuery('#commenterror').html(request.responseText);
jQuery('#commentload').hide(); // submit
jQuery('#commenterror').fadeIn(); // error
},
success: function(data) {
jQuery('textarea').each(function(){
this.value='';
});
jQuery('#commenterror').fadeOut();
if(jQuery(".commentlist li.comment").first().length != 0){jQuery(".commentlist li.comment").first().before(data)}
else {jQuery("ol.commentlist").append(data)}
jQuery(".commentlist li.comment").first().hide(0,function(){$(this).slideDown(1000)});
jQuery('#cmt-submit').attr('disabled', true).css({"background-color":"#6C6C6C","color":"#E0E0E0"});
jQuery('#commentload').fadeOut(1600);
setTimeout(function() {
jQuery('#cmt-submit').removeAttr('disabled').css({"background-color":"#0086C5","color":"#FFFFFF"});
},3000);
}
});
return false;
} );
}
주: 코드 는 아직도 개선 수요 가 있 습 니 다. 시간 이 없 기 때문에 다시 진화 하지 않 았 습 니 다.
CSS 코드 css 임의의 부분 추가.
#commentload,#commenterror{
display: none;
margin: 5px 0 0 0;
color:#D29A04;
float: left;
font-size:16px;
padding:0 0 0 20px;
}
#commentload{
background: url("img/loading.gif") no-repeat bottom left ;
}
#commenterror{
background: url("img/error.png") no-repeat bottom left ;
}
원리, 사고방식 원리: 자 바스 크 립 트 는 데이터 php 응답 을 제출 하고 결 과 를 출력 합 니 다. 자 바스 크 립 트 는 제출 단 추 를 누 르 면 자 바스 크 립 트 는 제출 동작 을 캡 처 하여 제출 한 데이터 (Name, Email, Web, Comment - text) 를 캡 처 하고 자 바스 크 립 트 Jquery 모드 를 이용 하여 브 라 우 저 를 작성 하여 POST (Name, Email, Web, Comment - text) 를 제출 합 니 다.요청 한 WordPress Function. php 파일 에 요청 을 받 아들 이 는 함수, 즉 이 열 에 있 는 ajax 를 구성 합 니 다.comment 함수 가 요청 에 오류 가 없 으 면 정확 한 결 과 를 출력 합 니 다. 요청 에 오류 가 있 으 면 잘못된 결 과 를 출력 합 니 다. 자 바스 크 립 트 는 댓 글 목록 에 동적 으로 추가 하여 오류 결 과 를 얻 습 니 다. 알림 표시 줄 개선 스타일 에 동적 으로 추가 합 니 다. 저 는 정말 미 적 감각 이 없어 서 공부 하고 있 습 니 다.제출 단 추 는 반환 결 과 를 얻 을 때 까지 클릭 한 후 3 초 동안 회색 으로 변 하 는 실효 상태 일 것 입 니 다. 이 점 전에 이 컴퓨터 에서 테스트 를 했 기 때문에 제출 순간 에 알 아차 리 지 못 했 습 니 다. 원 격 테스트 를 할 때 발 견 했 지만 고 치 려 면 테스트 를 해 야 합 니 다. 시간 이 너무 촉박 하면 고치 지 않 고 개선 할 기회 가 있 습 니 다.
결론 적 으로 WordPress 주제 에서 댓 글 스타일 의 자유 성과 다양성 때문에 지금까지 통용 되 는 AJAX 댓 글 플러그 인 이 없 는 것 같 습 니 다. 일부 고수 들 도 자신의 블 로 그 를 최적화 시 키 는 동시에 사고 와 일부 통용 핵심 코드 를 발표 할 수 밖 에 없 기 때문에 멋 진 기능 을 실현 하려 면 높 은 사람 이 도와 주지 않 으 면 코드 를 잘 배 울 수 밖 에 없습니다.언젠가 두 껍 고 얇 은 머리 를 할 수 있 기 를 기대한다.효 과 는 스스로 댓 글 검증 을 제출 하 세 요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.