亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

使用PHP+AJAX讓WordPress動態加載文章的教程

2024-05-04 23:40:55
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了使用PHP+AJAX讓WordPress動態加載文章的教程,即不用手動刷新瀏覽器頁面即可讓加載好的文章顯示,需要的朋友可以參考下
 

為什么要動態加載文章?

1. 快速向訪客展示頁面
文章很容是包含大量文字和多媒體資源 (如: 圖片, 視頻, 音樂), 加載這些內容需要占用很多的時間. 如果你的頁面上存在大量文章, 當訪客發現頁面久久沒有加載完成就感到不耐煩. 這是動態加載文章的主要目的.

2. 讓文章列表化
使頁面上的文章成為一個列表, 減少頁面的空間占用, 訪客可以方便的移動到頁面下方, 提高舊文章被點擊的幾率. 并且你可以在頁面上放置更多的文章而不用擔心頁面過長.

為什么不動態加載文章?

1. 對搜索引擎不友好
搜索引擎優化的目的是將有價值的東西盡量多的向搜索爬蟲展示, 包括最新的文章內容. 只有標題的文章讓爬蟲只知道這個文章而不知其文章側重, 使用 JavaScript 輸出的文章內容未必可以被抓取和分析. 這些對 SEO 來說都是不好的.
后來發現, 如果你的網站有固定的文章類型, 沒有畢業在文章列表頁顯示太多文章內容, 表示影響不大.

2. 增加了請求次數
雖然將文章折疊起來, 我們一般還是會想辦法向訪客顯示前面的幾篇文章. 這樣對用戶是友好的, 但是要增加請求的次數和數據庫訪問的次數.
后來我有選擇地顯示部分文章內容, 而且不是通過異步加載的方式, 也就是說, 這個問題是可以通過簡單的修改解決掉的.

3. 一些插件失效
因為需要自定義方法抓取文章, 如果不添加特殊處理, 很可能令部分 WordPress 插件失效.
可以通過特殊處理解決掉, 以后文章中會提及.

動態加載文章的設計思路

1. 找到頁面上所有文章
為每個文章添加一個展開/折疊按鈕

2. 向文章添加展開/折疊按鈕
點擊按鈕, 如果文章內容沒有加載, 加載并展開文章內容.
點擊按鈕, 如果文章內容已經加載, 則展開/折疊文章內容.

3. 加載文章內容
將文章的 id 發往后臺, 在數據庫中找到相應的文章內容并進行格式化, 返回響應顯示在頁面上.

JavaScript 處理代碼分析

1. 找到頁面上所有文章

/ 在文檔加載完畢的時候遍歷所有匹配文章的元素jQuery(document).ready(function(){ jQuery('div.post').each(function() { // 如果元素相應位置是文章 ID var id = jQuery(this).attr('id'); if(/^post/-[0-9]+$/.test(id)) {  // 則為每個文章添加一個展開/折疊按鈕  ... } });});
2. 向文章添加展開/折疊按鈕
toggle.toggle(function() { // 展開 // 如果文章內容為空, 加載文章內容 if(jQuery('#' + id + ' .content').text() == '') { ... } // 顯示文章內容, 并切換按鈕樣式 jQuery('#' + id + ' .content').slideDown(); jQuery(this).removeClass('collapse').addClass('expand');},function() { // 折疊 // 隱藏文章內容, 并切換按鈕樣式 jQuery('#' + id + ' .content').slideUp(); jQuery(this).removeClass('expand').addClass('collapse');// 將按鈕追加到文章標題前方}).prependTo(jQuery('#' + id + ' h2'));

3. 加載文章內容

// 取得文章 IDvar postId = id.slice(5);// 使用 AJAX 獲取并處理文章內容jQuery.ajax({ type:     'GET' ,url:     '?action=load_post&id=' + postId ,cache:    false ,dataType:  'html' ,contentType: 'application/json; charset=utf-8' // 取得返回內容之前顯示加載信息 ,beforeSend: function(data){loadPostContent(id, '<p class="ajax-loader">Loading...</p>');} // 獲取文章內容成功, 更新文章內容 ,success:   function(data){loadPostContent(id, data);} // 獲取文章內容失敗, 顯示出錯提示 ,error:    function(data){loadPostContent(id, '<p>Oops, failed to load data.</p>');}});

后臺處理
處理思路

從前臺傳到后臺的參數有兩個, 一個是 action ID, 用于確定使用的接口, 另一個是文章的 ID, 用于獲取文章對應的內容.

下面我們來分析一下wp-includes/post-template.php 的 get_the_content 方法.

function get_the_content($more_link_text = null, $stripteaser = 0) { global $id, $post, $more, $page, $pages, $multipage, $preview;  // 設定 "查看全文" 的鏈接文案 if ( null === $more_link_text ) $more_link_text = __( '(more...)' );  // 返回內容 $output = '';  // More 標簽是否存在的標記位 $hasTeaser = false;  // 如果文章要求輸入密碼, 并且在 Cookie 中找不到處理過的信息, 則返回要求輸入密碼的查看表單 if ( post_password_required($post) ) { $output = get_the_password_form(); return $output; }  // 請求的文章片段對應的頁面大于最大頁數 (即文章片段不存在), 則返回最大頁碼的文章片段 if ( $page > count($pages) ) $page = count($pages);  // 文章內容是最后分頁中的文章片段 $content = $pages[$page-1]; // 如果文中有 More 標簽, 要求切斷文章并輸出 "查看全文" 鏈接, 則重定義文章內容, 標記 More 標簽存在 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); }  // 如果進行了文章切斷處理, 且不存在分頁要求,  if ( (false !== strpos($post->post_content, '<!-- noteaser -->') && ((!$multipage) || ($page==1))) ) $stripteaser = 1;  // 獲取文章內容的第一部分; 如果在獨立文章存在 Read more 和切斷處理, 則文章內容為空 $teaser = $content[0]; if ( ($more) && ($stripteaser) && ($hasTeaser) ) $teaser = ''; $output .= $teaser;  // 如果文章分為多個片段, 在獨立文章中拼接上第二部分, 摘要內容中顯示 "閱讀全文" 鏈接 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);  // 返回文章內容 return $preview;}
你完全可以這樣想: 只要滿足一些傳入的參數, 去除一些不必要的, 更換一些可取代的, 將頁面返回改成輸出, 就是一個輸出文章內容的接口.

處理方法

如果我們暫時不考慮輸入密碼, 分頁等功能; 另外, 因為 More 和切斷功能不應該在展開文章內容中存在, 響應處理可以變得很簡單. 我們要做的事就這么幾個:
1. 做出 action 對應的接口
2. 獲取指定文章的內容
3. 格式化文章內容
4. 返回文章內容

多說無用, 直接上代碼, 加注釋:

function load_post() { // 如果 action ID 是 load_post, 并且傳入的必須參數存在, 則執行響應方法 if($_GET['action'] == 'load_post' && $_GET['id'] != '') { $id = $_GET["id"]; $output = '';  // 獲取文章對象 global $wpdb, $post; $post = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1", $id));  // 如果指定 ID 的文章存在, 則對他進行格式化 if($post) {  $content = $post->post_content;  $output = balanceTags($content);  $output = wpautop($output); }  // 打印文章內容并中斷后面的處理 echo $output; die(); }}// 將接口加到 init 中add_action('init', 'load_post');
 


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色播久久人人爽人人爽人人片视av| 亚洲精品日韩激情在线电影| 成人a免费视频| 亚洲最大的成人网| 国产91在线视频| 2019亚洲日韩新视频| 日韩精品极品毛片系列视频| 日韩精品在线观看视频| 97国产精品免费视频| 26uuu另类亚洲欧美日本老年| 欧美理论电影在线观看| 91免费在线视频| 日韩有码在线视频| 欧美另类99xxxxx| 国产精品久久久久久久av大片| 欧美一级黑人aaaaaaa做受| 国产精品精品视频一区二区三区| 九九热这里只有精品6| 久久这里只有精品99| 日韩一区二区福利| 欧美日韩中文字幕在线| 高清日韩电视剧大全免费播放在线观看| 国产999精品久久久影片官网| 久久久视频精品| 国产91在线视频| 97人洗澡人人免费公开视频碰碰碰| 韩国福利视频一区| 欧洲美女7788成人免费视频| 668精品在线视频| 久久天堂电影网| 成人国产精品久久久久久亚洲| 欧美亚洲在线播放| 日本国产一区二区三区| 国产精品美女无圣光视频| 日本一欧美一欧美一亚洲视频| 国产精品成人一区| 亚洲精品欧美日韩| 中文字幕亚洲综合久久| www.亚洲天堂| 亚洲大胆美女视频| 国产不卡av在线免费观看| 免费不卡欧美自拍视频| 久久久久久国产三级电影| 亚洲午夜激情免费视频| 日韩在线播放av| 中文字幕一区日韩电影| 国产精品99久久久久久人| 91久久在线播放| 精品久久在线播放| 97**国产露脸精品国产| 欧美放荡办公室videos4k| 久99九色视频在线观看| 中文字幕国产精品久久| 一区二区国产精品视频| 成人国产精品av| 亚洲欧美精品中文字幕在线| 国模精品视频一区二区三区| 国产精品日韩欧美| 欧洲精品毛片网站| 亚洲欧美日韩国产精品| 日韩欧美大尺度| 中文字幕精品在线| 欧美日韩国产123| 亚洲欧美在线免费观看| 亚洲xxxxx电影| 91精品国产综合久久香蕉922| 欧美视频二区36p| 日韩国产激情在线| 欧美一区二区大胆人体摄影专业网站| 日韩电视剧在线观看免费网站| 欧美一区二区三区精品电影| 国产日本欧美一区| 国产又爽又黄的激情精品视频| 成人av.网址在线网站| 国产欧美一区二区三区四区| 国产日韩欧美中文在线播放| 色综合久久天天综线观看| 欧美日韩ab片| 亚洲欧美中文字幕在线一区| 亚洲精品少妇网址| 97精品国产97久久久久久| 久久精品一偷一偷国产| 91日本视频在线| 中文字幕亚洲欧美一区二区三区| 国产亚洲精品久久久久久777| 成人午夜黄色影院| 亚洲最大成人网色| 日av在线播放中文不卡| 国产成人精品久久二区二区91| 亚洲免费视频网站| 国产精品一区专区欧美日韩| 免费不卡在线观看av| 国产欧美久久一区二区| 精品国产区一区二区三区在线观看| 国产精品免费视频xxxx| 亚洲欧美国产制服动漫| 亚洲精品视频播放| 岛国视频午夜一区免费在线观看| 亚洲偷欧美偷国内偷| 精品国产91乱高清在线观看| 国产99久久精品一区二区 夜夜躁日日躁| 精品国产一区二区三区久久狼5月| 亚洲精品国精品久久99热| 日韩视频中文字幕| 亚洲国产精品va在线看黑人| 国产精品午夜视频| 欧美性猛交xxx| 国产精品高潮视频| 精品美女永久免费视频| 欧美日韩国产色| 在线视频中文亚洲| 亚洲色图校园春色| 日韩69视频在线观看| 国产精品日韩专区| 日日狠狠久久偷偷四色综合免费| 国产亚洲视频在线观看| 欧美特黄级在线| 日韩中文字幕欧美| 国产精品视频导航| 亚洲国产成人在线视频| 国产日韩欧美在线观看| 亚洲品质视频自拍网| 日韩美女视频免费在线观看| 91精品国产91久久久久久| 国产91九色视频| 国产亚洲综合久久| 亚洲一区二区少妇| 国产婷婷成人久久av免费高清| 国产精品视频一区二区三区四| 久久综合88中文色鬼| 亚洲精品视频网上网址在线观看| 欧美成人剧情片在线观看| 成人网址在线观看| 亚洲精品视频二区| 欧美电影免费观看高清| 亚洲黄色片网站| 色综合久久久888| 欧美www在线| 91视频国产高清| 亚洲成人国产精品| 狠狠躁天天躁日日躁欧美| 亚洲天堂av在线免费观看| 国产精品视频免费观看www| 欧美性受xxxx黑人猛交| 日本伊人精品一区二区三区介绍| 日本精品一区二区三区在线播放视频| 国产suv精品一区二区三区88区| 日本亚洲欧洲色α| 播播国产欧美激情| 久久久精品一区二区| 亚洲三级av在线| 日韩国产欧美区| 精品久久久中文| 欧美超级乱淫片喷水| 久久中文字幕视频| 2024亚洲男人天堂| 欧美精品videosex极品1| 国产成人涩涩涩视频在线观看| 国产精品久久91| 91九色综合久久| 亚洲一区二区三区xxx视频| 欧美激情在线播放| 亚洲摸下面视频| 91久久在线视频|