iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 28
1

如果您有看上一篇文章,正好您是Wordpress方面的專家,您可能會覺得,我上一篇文章的範例,很落伍。因為要在Cordova 環境下,讀取Wordpress,上一篇的方式是行不通的,上一篇的範例,是網站和Wordpress在同一台主機的情況下,可以這樣使用。

這樣的環境,在Security方面的疑慮比較小,所以可以這樣使用。

那要透過Cordova開發出來的APP,去連Wordpress呢?

是的,還是Ajax,只是在Wordpress方面,需要調整。

在Wordpress安裝好之後,會產生一個資料夾,名稱是「WP-Admin」,裡面有一個檔案叫做「admin-ajax.php」,這個檔案,是讓Wordpress的工作者,可以透過它,以AJAX的方式,得到我們想要的,存在這台Wordpress裡的資料,當然,需要的Function要自己寫。寫好後,我們可以將想要的資料,扔到這個檔案裡面去,接著透過這個檔案的修改,得到我們想要的。

不過,我自己在測試時發現,要透過這個方式存取,必需有個前提時,「要先登入,才能取資料。」接下來,我們來看看相關程序圖吧。
http://ithelp.ithome.com.tw/upload/images/20161228/2000613249wdmevtqT.jpg
現在要介紹的是...admin-ajax.php部份,之前有提過,透過此方式,需要先登入到Wordpress裡面,所以,我們需要...1.傳送帳號、密碼。2.檢查確認後,才能繼續。

以下是需要加入在,admin-ajax.php裡的function。

function login()
{
    $get_data = array();
    $get_data['user_login'] = $_GET["username"]; //接收從遠端APP傳來的帳號
    $get_data['user_password'] = $_GET["password"]; //接收從遠端APP傳來的密碼

    $user = wp_signon($get_data, false);檢查帳密,使用的是Wordpress API,名稱為「wp_signon」
    if (is_wp_error($user))
    {
        echo "FALSE";
        die();
    }

    header("Content-Type: charset=UTF-8; application/json"); //宣告此PHP檔案,回應的格式為JSON,文字編碼為UTF-8

    $posts_array = array();

//下面使用Wordpress API中的WP_Query,官方文件網址如右: https://codex.wordpress.org/Class_Reference/WP_Query

//先將要取出的資抖,做出設定,並放置陣列中。
//下列要取出資料為「依日期、降冪排序、分類代碼ID為3的文章。」

    $args = array("post_type" => "post", "orderby" => "date", "order" => "DESC", "post_status" => "publish", "cat" => "3");

    $posts = new WP_Query($args); //將取出資料,放進$posts變數中。

    if($posts->have_posts()):
        while($posts->have_posts()): 
            $posts->the_post();

$post_array = array('title' => get_the_title(),  //讀取文章標題
            'link' => get_the_permalink(), //讀取文章連結
            'date' => get_the_date(), //讀取發出日期
            'image' => wp_get_attachment_url(get_post_thumbnail_id())); //讀取特色圖片
            array_push($posts_array, $post_array); //將上述的值,再放進陣列
        endwhile;
        else:
            echo "{'posts' = []}";
            die();
    endif;

    echo json_encode($posts_array);  回傳以json編碼的陣列內容。
    die();
    die();
}

add_action("wp_ajax_login", "already_logged_in"); //add_action,是Wordpress本身提供的函式(函數)
add_action("wp_ajax_nopriv_login", "login");

上面php範例,以json編碼的陣列內容,如下圖。
http://ithelp.ithome.com.tw/upload/images/20161228/20006132HHFNEM5kPm.png

上述的是Wordpress 主機(SERVER)端,需要準備的程式碼,那在Cordova這端呢?

    document.addEventListener('deviceready', onDeviceReady, false);

    function onDeviceReady() {
        $.ajax({
//這邊,直接呼叫述述範例的admin-ajax.php
//特別說明(一)因為必需要先login,但又不想讓使用者做「登入」這個動作,所以將帳號和密碼直接寫在要傳送出去的值當中,
//特別說明(二)Cordova 會將程式碼打包,所以比較不用擔心帳、密會被看到。
//特別說明(三)請不要將Wordpress裡的最高權限帳號和密碼,帶到此值當中。

            url: 'http://您的url/wp-admin/admin-ajax.php?action=login&username=account_name&password=password',
            type: 'post',
            dataType: "json",
            success: function (data) {
            var html ="";
                   for(var count = 0; count < data.length; count++)
        {
                var  title = data[count].title;
               var  link = data[count].link;
                var  date = data[count].date;
                var  image = data[count].image;
       html = html + "<li>" + "<a href='javascript:open_browser(\"" + link + "\")'>" + "<img height='128' width='128' src='" + image + "'>" + "<h2>" + title + "</h2>" + "<p>" + date + "</p></a></li>";
        }
             document.getElementById("posts").innerHTML = html;
        $("#posts").listview("refresh");
            }
        });
                function open_browser(link) {
            window.open(link, '_self', 'location=yes');
        }
}
最後,就可以看到結果啦! 

http://ithelp.ithome.com.tw/upload/images/20161228/20006132o4BEEiG6Bq.png

Cordova 不透過InAppBrowser的方式,呼叫遠端Wordpress的內容,使用方式如上,供參考。

(待)

2016/12/28 Sunallen


上一篇
{"27":"Wordpress(上)"}
下一篇
{"29":"Geo+Gmp+導航+Places"}
系列文
我的網站、您的手機、它的Cordova、誰的第三方32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
海綿寶寶
iT邦大神 1 級 ‧ 2016-12-28 09:39:40

曾經接過一個案子
也是要去抓 WordPress 的 blog
記得我是用比較偷懶的做法
直接去讀 RSS
/images/emoticon/emoticon55.gif

我要留言

立即登入留言