WordPress响应Ajax请求

前奏

在网站留言板有个访客评论自动排第一的功能,之前是这样做的:
把以下代码放入 functions.php 文件内。

/***
* 黑鸟博客出品
******/
function AutoFirst(){
    global $wpdb;
    $queryaf="select comment_author, comment_author_url, comment_date from $wpdb->comments where comment_ID in (select max(comment_ID) from $wpdb->comments where comment_approved='1' and comment_author_url !='' and user_id='0'  GROUP BY comment_author_email)  ORDER BY comment_date DESC LIMIT 20";
    //这边取20条数据
    $wally = $wpdb->get_results($queryaf);
    foreach ($wally as $commentaf){
        $tmpy= "<li><span style=\"color:#000000\">• </span><a target=\"_blank\"  rel=\"nofollow\" href=\"/go.php?url=".$commentaf->comment_author_url."\">".$commentaf->comment_author."</a></li>";
        $outputy .= $tmpy;
    }
    $outputy = "<ul class=\"liuyanpage-one\" style=\"padding-left: 0px;\">".$outputy."</ul>";
    echo $outputy ;
}

本站参考样式:

/***
* 留言版评论自动排第一 - 黑鸟博客出品
******/
.liuyanpage-one ul{color:rgba(255,255,255,.15);font-size: 14px;;overflow: hidden}
 .liuyanpage-one ul:after{content:" ";clear:both;display:block}
.liuyanpage-one li{float:left;width:20.0%;position:relative;transition:all .3s ease-out;border-radius:5px;line-height:1.5;height:26px;display:block;overflow: hidden;padding:0px 10px 0px 0px;}
.liuyanpage-one li:hover{background:rgba(230,244,250,.5)}
.liuyanpage-one li a{padding:0px 0px 0px 2px;color:#000000;overflow: hidden}
@media screen and (max-width:760px) {
.liuyanpage-one li{width:50%}
.liuyanpage-one ul{padding-left:5px}}
@media screen and (min-width:768px) and (max-width:990px){
.liuyanpage-one li{width:20%}
.liuyanpage-one ul{padding-left:5px}}

在需要调用的域名直接使用以下代码调用即可

<div>< ?php AutoFirst(); ?></div>

这样就基本可以用了,但是缺点也很明显,网站的留言板每次打开都得等上大几秒才开始显示页面,相当的影响访客体验。

AJAX功能测试

站长首先想到的是不是可以延迟加载或者异步加载,我这一菜鸟本来还在找怎么通过 JavaScript 异步调用 PHP 函数,转了一圈明白自己多么二愣子,大家回答基本一致的,这基本只能 ajax 通过 get或post 提交数据请求服务器地址,再通过返回的值来处理。

首先还是在wordpress主题的functions.php函数内添加以下代码:

function fun_hello_world(){
    echo '恭喜你,服务器响应成功!!';
    wp_die();//停止内容
}
add_action('wp_ajax_hello_world', 'fun_hello_world');  //管理员调用 
add_action('wp_ajax_nopriv_hello_world', 'fun_hello_world');  //登录用户可以调用

其次钩子函数必须是wp_ajax_* (这个是admin用户的权限)和 wp_ajax_nopriv_*(这个是普通用户的权限),最后fun_hello_world()函数里必须有一个 echo 和 wp_die()或die()结束。并且 echo的必须是string类型。

在前端需要调用的地方定义一个占位标签,我这边放在留言板的正文内容前。

<div id="ajaxtxtc"></div>

再引入以下JavaScript代码可以直接使用<script>标签包裹放在任意可以调用的地方。

var data = {action: 'fun_hello_world'};
$.post("<?php echo admin_url('admin-ajax.php');?>", data, function (data) {   
      $("#ajaxtxtc").html(data); //获取内容回调
   });

测试成功,再替换为AutoFirst()函数,现在可以迅速地先显示留言板页面,并且再过几秒户也能正确显示ajax返回的结果。

其他

分享一个带参数的示例:
JS请求端:

jQuery("#submit").click(function () {
    jQuery.ajax({
        type: 'POST',
        url: ajaxurl,    
       // ajaxurl为内置js变量,值为"/wp-admin/admin-ajax.php"
        data: {
            'action': 'xiangjia',    // ajax action名称
            'param1': parseInt(100 * Math.random()),
            'param2': parseInt(100 * Math.random())
        },
        success: function (data) {
            alert("结果:" + data);
        },
        error: function (data) {
            console.log(data);
        }
    });
});

PHP响应端:

//action中形参$tag需以“wp_ajax_”作为前缀,
//前缀后面为ajax action名(如:“xiangjia”)
add_action('wp_ajax_xiangjia', 'xiangjia');
function xiangjia()
{
    if (!empty($_POST)) {
        $param1 = intval($_POST['param1'], 0);
        $param2 = intval($_POST['param2'], 0);
        echo $param1 . ' + ' . $param2 . ' = ' . ($param1 + $param2);
        exit();
    }
    echo 0;
    exit();
}

这样通过这两个例子基本可以完成需求,站长就一个面向百度编程的伪码农,能搞定着实欣喜。

发表评论

电子邮件地址不会被公开。 必填项已用*标注