wordpress ajax 应用开发

之前开发过一些简单的WordPress的插件和hook处理,但毕竟都很简单,用了WordPress那么久很多WEB常用的应用场景需求从未尝试过,因此这段时间突发奇想,要不将平时工作的一些需求内容在WordPress系统环境试一下,看一下WordPress的扩展开发难易度如何?

正好手里有几千条文章数据,想将其导入到 wordpress 系统中。

其中需求如下:
1.能一次性将文章导入到系统中
2.不同的文章内容需要放入到不同的分类中去,同时这些分类不一定存在,因此需要先判断文章归属的分类是否存在,不存在则创建。然后将文章归类到该分类中
3.虽然文章有几千条,导入过程中容易因为PHP执行时间过长而超时跳出,因此需要一个方法来规避这个问题
4.WordPress版本是4.7.x

第一次尝试,在CLI环境下,新建一个php 文件,然后模仿index.php引入 wp-load.php 文件进来,直接调用WordPress的API程序。经过尝试post相关的API可操作,但是涉及到如分类、标签等API的时候就跪了,不知道为什么这两类API一直报函数未定义,某些API貌似需要用户登录状态和信息才能调用(我猜)!

果断放弃第一次尝试的想法。

后面又考虑是不是考虑以plugin的方式来写一个界面呢?

这样的优点是可以毫无顾忌的调用系统内的所有API也不同担心涉及用户状态等问题。但有数据多导入超时怎么办?

以前写导入程序的时候用IFRME内嵌一个页面然后不停的刷新整个页面就不存在超时,但是用IFRAME的话实际也难以管理,逻辑简单,但出问题调试麻烦。果断放弃!

后面决定考虑与IFRAME相同的AJAX方式来实现整个目标。

因此我就需要做好以下几点的论证:

1、在WordPress创建一个AJAX的请求页面?
2、导入的数据在MYSQL的另一个库中,也就是和WORDPRESS不同属一个库,因此需要建立一个新的数据操作对象来处理数据源的读取
3、使用AJAX肯定离不开JS,而且便于操作的JS库我是优先JQUERY库,因此如何使用WordPress中自带的JQUERY库

去wordpress.org官网看了一下,关于AJAX应用的说明,其实也不复杂。整体的思路如下几点:

1.在plugin中创建一个函用于处理和返回函数,例如名称叫 return_data

  1. function return_data(){
  2.   // some code...
  3. }

2.通过为这个页面注册如WordPress中。

然后通过一个hook来引用这个函数,也可以说是将函数注册入wordpress的ajax响应中。具体如下:

  1. add_action( 'wp_ajax_return_data', 'return_data' );

从上述的代码片段可以分析出:
wp_ajax_* 属于钩子的前缀,而完整的 wp_ajax_return_data 我觉得可以理解为注册一个ID给WordPress,然后第二个参数的 return_data 就好理解了,是引用的函数名

3.如何接受参数?

这个时候AJAX的请求页面就已经创建成功了,这个时候我们希望这个页面能接受GETPOST过来的参数,如何操作呢?

  1. function return_data(){
  2.   $id = intval($_POST['new_post_id']);
  3. }

这个更简单,简单粗暴。(应该还有更好的方法来接受参数,毕竟要考虑注入攻击的问题和重复造轮子的问题)

AJAX的问题解决了,接下来要考虑如何在WordPress中读取另一个库的数据,就是说创建一个新数据对象来获取数据源。

我的方法是比较笨,就是引入了另一个MYSQL的PHP类来链接另一个库。假设这个类库的文件名叫 “mysqliDB.php” 那么我就需要考虑在插件页面中如何来引用它。

首先将类文件放入自己写的这个插件所在文件夹

然后在插件的主界面插入这个文件(有点废话),大概是这样:

  1. <?php
  2. /*
  3. Plugin Name: import_db
  4. Plugin URI: http://webcaft.com
  5. Description: 导入数据使用
  6. Author: WANGWEI
  7. Version: 1.0
  8. Author URI: http://webcaft.com
  9. */
  10. define( 'IMPORT_DB_DIR', plugin_dir_path( __FILE__ ) );
  11.  
  12. require_once( IMPORT_DB_DIR . 'MysqliDb.php' );
  13.  
  14. function return_data(){
  15.   $id = intval($_POST['new_post_id']);
  16.  
  17.   //这样就可以直接申明一个数据对象来读取其它库的数据
  18.   $DB = new MysqliDb("127.0.0.1","root","","new_posts");
  19. }

至此我们已经可以获取另一个库的数据信息了。当然到此依然没结束,因为有一个问题,通过hook引用函数创建的页面是一个完整的HTML页面(也可以理解成是一个text类型的页面)包含有…,这些信息,这肯定不是我们想要的。如何报这个AJAX请求页面只显示我们想输出的信息呢?

通过 wp_die()

当使用了该方法后,这页面就不会去加载wordpress公共的html信息了,因此根据上一部分代码我们可以扩展如下:

  1. <?php
  2. /*
  3. Plugin Name: import_db
  4. Plugin URI: http://webcaft.com
  5. Description: 导入数据使用
  6. Author: WANGWEI
  7. Version: 1.0
  8. Author URI: http://webcaft.com
  9. */
  10. define( 'IMPORT_DB_DIR', plugin_dir_path( __FILE__ ) );
  11.  
  12. require_once( IMPORT_DB_DIR . 'MysqliDb.php' );
  13.  
  14. function return_data(){
  15.   $id = intval($_POST['new_post_id']);
  16.  
  17.   //这样就可以直接申明一个数据对象来读取其它库的数据
  18.   $DB = new MysqliDb("127.0.0.1","root","","new_posts");
  19.   $DATA = $DB->GetAll("select * from contents");
  20.  
  21.   echo json_encode($DATA);
  22.  
  23.   wp_die();//注意这里
  24. }

接下来就是JQUERY的引用。很多人都是重新去加载一个自己放置的最新版本的JQUERY,其实我觉得除非特殊情况,一般没必要去自己加载,加载了还多了一个JS文件请求,当然我偷懒了直接引用(就是页面里有WordPress原配的JQUERY和我自己引用的JQUERY。应该有替换的方案,这里不做研究)

这一步相对比较简单直接在你要引用JQUERY的页面函数中直接注册一个jQuery,代码如下:

  1. <?php
  2. function main() {
  3.    wp_register_script( 'my_plugin_script', plugins_url('/jquery-1.11.2.min.js', __FILE__), array('jquery'));
  4.    wp_enqueue_script("my_plugin_script");
  5.  
  6.    ?>
  7.       //some html code ....
  8.       <script>
  9.           $(function(){
  10.                //some js code ....
  11.           })
  12.       </script>
  13.    <?php
  14. }

如果你不想自己引用也可以直接使用WordPress自带的JQUERY版本

  1. <?php
  2. function main() {
  3.    ?>
  4.       //some html code ....
  5.       <script>
  6.           jQuery(function($){
  7.                //some js code ....
  8.           })
  9.       </script>
  10.    <?php
  11. }

到这里JQEURY的引用结束。

我们来看看如何通过分类和文章的API来检查分类、创建分类、再提交文章。

1、首先判断分类是否存在,使用的API如下

  1. $parent = category_exists("Finance");

category_exists 的意思就是当分类存在返回该分类的ID值,否则返回false

2、创建分类

因此根据上述的代码来看,如果$parent的值为false的话我们就需创建这个分类,代码如下:

  1. $newCate = array(
  2.     "cat_name" => "Finance", //分类的名称
  3.     'taxonomy' => 'category', //词汇类型,直接填写category即可
  4.     "category_description" => "", //描述信息
  5.     "category_nicename" => "finance",//分类昵称,根据说明是应用于URI中
  6.     "category_parent" => "" //父级分类,如果父级分类存在,那么直接填写父级分类的ID值
  7. );
  8. $parent = wp_insert_category($newCate);

代码最后一行 wp_insert_categeory 为插入分类,成功插入分类数据后,返回该新分类的ID值,便于我们如果要创建子分类的时候进行使用

分类的操作就到此,我们看一下如何添加一篇文章

这个相对比较简单,API也容易理解

  1. //将内容添加如wordpress
  2. $postData = array(
  3.     'post_title'    => wp_strip_all_tags($title),//文章标题
  4.     'post_content'  => $content,//文章内容
  5.     'post_status'   => 'publish',//发布状态
  6.     'post_author'   => 1,//发布人的ID
  7.     'post_category' => array($thisCate) //文章所属分类
  8. );
  9. wp_insert_post( $postData );

参数说明:

post_titlewp_strip_all_tags($title) 文章标题,需要配合wp_strip_all_tags用来清理掉html信息
post_content 文章内容
post_status 发布状态
post_author 发布人的ID,1是指初始的管理员用户
post_category 文章所属分类,因为wordpress的文章可以归属于多个分类,因此这里使用的数组

添加文章API
wp_insert_post 该API为添加文章的API

至此整个导入文章的插件在代码方面的内容已经说明完。下面是具体完整的代码:

  1. <?php
  2. /*
  3. Plugin Name: import_db
  4. Plugin URI: http://webcaft.com
  5. Description: 导入数据使用
  6. Author: WANGWEI
  7. Version: 1.0
  8. Author URI: http://webcaft.com
  9. */
  10.  
  11. define( 'IMPORT_DB_DIR', plugin_dir_path( __FILE__ ) );
  12.  
  13. require_once( IMPORT_DB_DIR . 'MysqliDb.php' );
  14.  
  15. function import_db_init(){
  16.     //create new top-level menu
  17.     add_menu_page('Import DB', 'Import DB', 'manage_options', __FILE__, 'main');
  18.  
  19.     //call register settings function
  20.     add_action( 'init', array( 'MysqliDb', 'init' ) );
  21. }
  22.  
  23. function main() {
  24.     //register our settings
  25.     $DB = new MysqliDb("127.0.0.1","root","","new_contents");
  26.  
  27.     $sql = "SELECT id FROM z_content where export = 0";
  28.     $data = $DB->GetAll($sql);
  29.  
  30.     $ids = array();
  31.     if($data){
  32.         foreach($data as $row){
  33.             $ids[] = $row['id'];
  34.         }
  35.     }
  36.  
  37.     ?>
  38.  
  39.     <button type="button" id="importbtn">import</button>
  40.     <div id="result_list"></div>
  41.     <script type="text/javascript" >
  42.         var data = <?php echo json_encode($ids);?>;
  43.         var i = 0;
  44.  
  45.         function getPost(id){
  46.             var _data = {
  47.                 'action': 'get_ajax',
  48.                 'zpost_id': id
  49.             };
  50.  
  51.             jQuery.ajax({
  52.                 url:ajaxurl,
  53.                 dataType:"json",
  54.                 type:"post",
  55.                 data:_data,
  56.                 success:function(reponse){
  57.                     console.log(reponse);
  58.                     jQuery("#result_list").append("<p>"+reponse.msg+"</p>");
  59.                     i++;
  60.                     if(i < data.length){
  61.                         getPost(data[i]);
  62.                     }
  63.                 }
  64.             });
  65.         }
  66.  
  67.         window.onload = function(){
  68.             var importBTN = jQuery("#importbtn");
  69.  
  70.             importBTN.on("click",function(){
  71.                 if(data.length < 1){
  72.                     console.log("无数据");
  73.                     return false;
  74.                 }
  75.                 getPost(data[i]);
  76.             });
  77.         }
  78.  
  79.     </script> <?php
  80. }
  81.  
  82. function get_ajax(){
  83.     $DB = new MysqliDb("127.0.0.1","root","","new_contents");
  84.  
  85.     $id = intval( $_POST['zpost_id'] );
  86.  
  87.     //检查父类是否存在,不存在则创建
  88.     $parent = category_exists("Finance");
  89.     if(!$parent){
  90.         $newCate = array(
  91.             "cat_name" => "Finance",
  92.             'taxonomy' => 'category',
  93.             "category_description" => "",
  94.             "category_nicename" => "finance",
  95.             "category_parent" => ""
  96.         );
  97.         $parent = wp_insert_category($newCate);
  98.     }
  99.  
  100.     if(!$parent){
  101.         echo json_encode(array(
  102.             "state" => false,
  103.             "msg" => "父级分类不存在且无法创建"
  104.         ));
  105.         wp_die();
  106.         exit;
  107.     }
  108.  
  109.     $sql = "select * from my_content where id = {$id};";
  110.     $data = $DB->GetRow($sql);
  111.     if($data){
  112.         $title = $data['post_title'];
  113.         $content = $data["post_content"];
  114.         $catName = $data["name"];
  115.         $category_nicename = str_replace("\S","_",$catName);
  116.         $category_nicename = strtolower($category_nicename);
  117.  
  118.         //检查当前分类是否存在,不存在则创建
  119.         $thisCate = category_exists($catName);
  120.         if(!$thisCate){
  121.             $newCate = array(
  122.                 "cat_name" => $catName,
  123.                 'taxonomy' => 'category',
  124.                 "category_description" => "",
  125.                 "category_nicename" => $category_nicename,
  126.                 "category_parent" => $parent
  127.             );
  128.             $thisCate = wp_insert_category($newCate);
  129.         }
  130.  
  131.         //将内容添加如wordpress
  132.         $postData = array(
  133.             'post_title'    => wp_strip_all_tags($title),
  134.             'post_content'  => $content,
  135.             'post_status'   => 'publish',
  136.             'post_author'   => 1,
  137.             'post_category' => array($thisCate)
  138.         );
  139.         wp_insert_post( $postData );
  140.         $DB->where("id",$id);
  141.         $DB->update("z_content",array(
  142.             "export" => 1
  143.         ));
  144.  
  145.         echo json_encode(array(
  146.             "state" => true,
  147.             "msg" => "ID:{$id} {$title} 导出成功!"
  148.         ));
  149.     }else{
  150.         echo json_encode(array(
  151.             "state" => false,
  152.             "msg" => "ID:{$id} 未找到该信息"
  153.         ));
  154.     }
  155.  
  156.  
  157.     wp_die();
  158. }
  159. add_action( 'wp_ajax_get_ajax', 'get_ajax' );
  160. add_action('admin_menu', 'import_db_init');


发表评论?

1 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

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