關(guān)于 WordPress 動(dòng)態(tài)加載文章的原因, 利弊, 思路, 以及前臺(tái) JavaScript 的實(shí)現(xiàn), 我已經(jīng)在以前的文章中很具體地講解過了. 可以轉(zhuǎn)跳《動(dòng)態(tài)加載文章內(nèi)容》一文了解相關(guān)內(nèi)容.
因?yàn)闀r(shí)間問題, 自己的沒有做得很滿意, 所以沒有說明如何處理后臺(tái)響應(yīng), 出了那么一個(gè)不完整的教程. 直到昨天有人來公司面試跟我提起這個(gè), 覺得還是可以說說的. 本文將會(huì)對(duì)此進(jìn)行具體的講解.
處理思路
從前臺(tái)傳到后臺(tái)的參數(shù)有兩個(gè), 一個(gè)是 action ID, 用于確定使用的接口, 另一個(gè)是文章的 ID, 用于獲取文章對(duì)應(yīng)的內(nèi)容.
《動(dòng)態(tài)加載文章內(nèi)容》一文中我提示過, 可以參考 wp-includes/post-template.php 的 get_the_content 方法, 通過文章 ID 獲取文章內(nèi)容. 下面我們來分析一下這個(gè)方法.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
function get_the_content($more_link_text = null, $stripteaser = 0) {
global $id, $post, $more, $page, $pages, $multipage, $preview;
// 設(shè)定 "查看全文" 的鏈接文案
if ( null === $more_link_text )
$more_link_text = __( '(more...)' );
// 返回內(nèi)容
$output = '';
// More 標(biāo)簽是否存在的標(biāo)記位
$hasTeaser = false;
// 如果文章要求輸入密碼, 并且在 Cookie 中找不到處理過的信息, 則返回要求輸入密碼的查看表單
if ( post_password_required($post) ) {
$output = get_the_password_form();
return $output;
}
// 請(qǐng)求的文章片段對(duì)應(yīng)的頁面大于最大頁數(shù) (即文章片段不存在), 則返回最大頁碼的文章片段
if ( $page > count($pages) )
$page = count($pages);
// 文章內(nèi)容是最后分頁中的文章片段
$content = $pages[$page-1];
// 如果文中有 More 標(biāo)簽, 要求切斷文章并輸出 "查看全文" 鏈接, 則重定義文章內(nèi)容, 標(biāo)記 More 標(biāo)簽存在
if ( preg_match('/<!--more(.*?)?-->/', $content, $matches) ) {
$content = explode($matches[0], $content, 2);
if ( !empty($matches[1]) && !empty($more_link_text) )
$more_link_text = strip_tags(wp_kses_no_null(trim($matches[1])));
$hasTeaser = true;
} else {
$content = array($content);
}
// 如果進(jìn)行了文章切斷處理, 且不存在分頁要求,
if ( (false !== strpos($post->post_content, '<!-- noteaser -->') && ((!$multipage) || ($page==1))) )
$stripteaser = 1;
// 獲取文章內(nèi)容的第一部分; 如果在獨(dú)立文章存在 Read more 和切斷處理, 則文章內(nèi)容為空
$teaser = $content[0];
if ( ($more) && ($stripteaser) && ($hasTeaser) )
$teaser = '';
$output .= $teaser;
// 如果文章分為多個(gè)片段, 在獨(dú)立文章中拼接上第二部分, 摘要內(nèi)容中顯示 "閱讀全文" 鏈接
if ( count($content) > 1 ) {
if ( $more ) {
$output .= '<span id="more-' . $id . '"></span>' . $content[1];
} else {
if ( ! empty($more_link_text) )
$output .= apply_filters( 'the_content_more_link', ' <a href="' . get_permalink() . "#more-$id\" class=\"more-link\">$more_link_text</a>", $more_link_text );
$output = force_balance_tags($output);
}
}
if ( $preview ) // preview fix for javascript bug with foreign languages
$output = preg_replace_callback('/\%u([0-9A-F]{4})/', create_function('$match', 'return "" . base_convert($match[1], 16, 10) . ";";'), $output);
// 返回文章內(nèi)容
return $preview;
}
|
你完全可以這樣想: 只要滿足一些傳入的參數(shù), 去除一些不必要的, 更換一些可取代的, 將頁面返回改成輸出, 就是一個(gè)輸出文章內(nèi)容的接口.
處理方法
如果我們暫時(shí)不考慮輸入密碼, 分頁等功能; 另外, 因?yàn)?More 和切斷功能不應(yīng)該在展開文章內(nèi)容中存在, 響應(yīng)處理可以變得很簡單. 我們要做的事就這么幾個(gè):
1. 做出 action 對(duì)應(yīng)的接口
2. 獲取指定文章的內(nèi)容
3. 格式化文章內(nèi)容
4. 返回文章內(nèi)容
多說無用, 直接上代碼, 加注釋:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
function load_post() {
// 如果 action ID 是 load_post, 并且傳入的必須參數(shù)存在, 則執(zhí)行響應(yīng)方法
if($_GET['action'] == 'load_post' && $_GET['id'] != '') {
$id = $_GET["id"];
$output = '';
// 獲取文章對(duì)象
global $wpdb, $post;
$post = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1", $id));
// 如果指定 ID 的文章存在, 則對(duì)他進(jìn)行格式化
if($post) {
$content = $post->post_content;
$output = balanceTags($content);
$output = wpautop($output);
}
// 打印文章內(nèi)容并中斷后面的處理
echo $output;
die();
}
}
// 將接口加到 init 中
add_action('init', 'load_post');
|
看完這段代碼, 是不是感到相當(dāng)?shù)暮唵蚊髁? 因?yàn)檫@是最基本的操作, 很多功能并沒考慮在內(nèi). Okay, 這樣就引出多個(gè)問題:
1. 如果存在某個(gè)插件, 會(huì)對(duì)文章內(nèi)容進(jìn)行特殊處理 (如: WP-Polls), 響應(yīng)處理需要特殊處理嗎? 如何操作?
2. 如果有加密文章, 如何向用戶呈現(xiàn)? 前后臺(tái)又該如何配合?
3. 如果存在文章分頁, 當(dāng)用戶點(diǎn)擊翻頁鏈接時(shí)會(huì)發(fā)生什么事情? 怎樣處理體驗(yàn)更好?
這些問題作為后面的話題我會(huì)逐一講解并解決掉, 但再此之前, 你是否已經(jīng)想到解決辦法了?
|