由於上次免費釋出的一個主題,很多網友都說主題的推廣跳轉連結沒有跳轉,原因很多都是偽靜態造成的,不管什麼原因,現將實現跳轉連結的教程先寫出來,也許能給無法跳轉的網友一點靈感。

我們需要的功能:站內的連結類似 http://ashuwp.com/go/111   這種型別的地址,點選進去跳轉到一個站外連結,其中前面的 111 為文章 ID,要跳轉的站外連結由文章的自定義欄位新增。

實現方法:所有 http://ashuwp.com/go/xxx 這種型別的連結由主題中的 go.php 檔案中處理,然後透過地址中的文章 ID,獲取到要跳轉的站外連結,透過 WordPress 的 wp_redirect 函式跳轉或者輸出 js 實現跳轉。

 

步驟一、新增外部連結

先給文章新增一個自定義欄位用來輸入一個要跳轉的站外連結,比如淘寶客的推廣連結,自定義欄位的新增可以透過本工作室提供的自定義欄位類檔案實現:WordPress 進階教程 (十): 後臺建立自定義面板類檔案,當然你也可以透過文章編輯器下面的自定義欄目新增,如圖 (我們新增了一個名為_buy_link 的自定義欄位,用來輸入我們的推廣連結):

步驟二、將站內連結重寫到主題的 go.php 處理檔案
在主題中新建一個 go.php 檔案,然後在 functins.php 檔案中新增下列程式碼:關於 url 重寫,請參考本站教程 WordPress 進階教程 (16): 新增一個重寫規則,構建新頁面初試前後的幾篇文章。

  1. //為不帶 http 的地址新增 http   
  2. function addhttp($url) {   
  3.     if (!preg_match("~^(?:f|ht)tps?://~i"$url)) {   
  4.         $url = "http://" . $url;   
  5.     }   
  6.     return $url;   
  7. }   
  8.   
  9. /********新增 query 變數************/  
  10. function ashuwp_query_vars($public_query_vars) {   
  11.     $public_query_vars[] = 'my_custom_page_type';    
  12.     $public_query_vars[] = 'pid';   
  13.     return $public_query_vars;     
  14. }   
  15.   
  16. /************重寫規則*************/  
  17. function ashuwp_rewrite_rules( $wp_rewrite ){   
  18. $new_rules = array(   
  19. 'go/?([0-9]{1,})/?$' => 'index.php?my_custom_page_type=buy_page&pid='.$wp_rewrite->preg_index(1),   
  20. );   
  21. $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;   
  22. }   
  23.   
  24. /************模板載入規則****************/  
  25. function ashuwp_template_redirect(){   
  26.     global $wp,$wp_query,$wp_rewrite;   
  27.     if( !isset($wp_query->query_vars['my_custom_page_type']) )   
  28.         return;   
  29.     $reditect_page =  $wp_query->query_vars['my_custom_page_type'];   
  30.        
  31.     if ($reditect_page == "buy_page"){   
  32.         include(get_template_directory().'/go.php');   
  33.         die();   
  34.     }   
  35. }   
  36.   
  37. /*********更新重寫規則***************/  
  38. function ashuwp_flush_rewrite_rules() {   
  39.     global $pagenow$wp_rewrite;   
  40.   
  41.     if ( 'themes.php' == $pagenow && isset( $_GET['activated'] ) )   
  42.         $wp_rewrite->flush_rules();   
  43. }   
  44.   
  45. add_action( 'load-themes.php', 'ashuwp_flush_rewrite_rules' ); //啟用主題的時候   
  46. add_action('generate_rewrite_rules', 'ashuwp_rewrite_rules' ); //新增重寫規則   
  47. add_action('query_vars', 'ashuwp_query_vars');     
  48. add_action("template_redirect", 'ashuwp_template_redirect');  

上面的程式碼將站內所有類似 http://ashuwp.com/go/xxx 這種地址重寫載入 go.php 檔案來處理。

很多不支援偽靜態,或者偽靜態沒設定好的主機,訪問不了類似 http://ashuwp.com/go/xxx 這種靜態地址,所有無法重寫此類 url,判斷偽靜態是否可用,只需在  後臺設定-> 固定連線  將固定連線結構任意設定一種 (非預設的 http://ashuwp.com/?p=123 這種即可),然後任意找一篇文章檢視,如果正常訪問,則偽靜態基本無問題。

 

步驟三、新增 go.php 中的跳轉程式碼。

提供兩種方式,任選一種即可。

第一種:透過 js 來跳轉。

  1. <?php      
  2. /*******跳轉模板*******/     
  3. global $wp_rewrite,$wp_query;      
  4. //從請求的地址中獲取文章 ID      
  5. if( isset($wp_query->query_vars['pid']) && $wp_query->query_vars['pid']!='' )      
  6.     $post_id = $wp_query->query_vars['pid'];      
  7. else     
  8.     $post_id = 0;      
  9.      
  10. //如果文章 ID 存在      
  11. if$post_id ){      
  12.     //透過文章 ID 獲取要跳轉的站外連結--自定義欄位      
  13.     $buy_link = get_post_meta($post_id,'_buy_link',true);   
  14.     $buy_link = htmlspecialchars_decode($buy_link);//將 html 實體換回預定義字元   
  15.     $buy_link = trim($buy_link);   
  16.     $buy_link = addhttp(trim($buy_link));   
  17.     if($buy_link){ ?>      
  18.         <?php //跳轉到對應的連結?>      
  19.         <script type="text/javascript">window.location.href="<?php echo $buy_link;?>";</script>      
  20.     <?php }else{ ?>      
  21.         <?php //如果沒有設定跳轉到奧首頁?>      
  22.         <script type="text/javascript">window.location.href="<?php echo home_url();?>";</script>      
  23.     <?php }      
  24. }else{ ?>      
  25. <?php //無 ID 則跳轉到首頁 ?>      
  26.     <script type="text/javascript">window.location.href="<?php echo home_url();?>";</script>      
  27. <?php } ?>   

第二種,使用 wp_redirect 函式

  1. <?php   
  2. /*******跳轉模板*******/  
  3. global $wp_rewrite,$wp_query;   
  4. //從請求的地址中獲取文章 ID   
  5. if( isset($wp_query->query_vars['pid']) && $wp_query->query_vars['pid']!='' )   
  6.     $post_id = $wp_query->query_vars['pid'];   
  7. else  
  8.     $post_id = 0;   
  9. if$post_id ){   
  10.     //獲取跳轉連結   
  11.     $buy_link = get_post_meta($post_id,'_buy_link',true);   
  12.     $buy_link = htmlspecialchars_decode($buy_link);//將 html 實體換回預定義字元   
  13.     $buy_link = trim($buy_link);   
  14.     $buy_link = addhttp(trim($buy_link));   
  15.     if($buy_link){   
  16.         //跳轉   
  17.         wp_redirect($buy_link, 301);   
  18.     }else{   
  19.         //跳轉到首頁   
  20.         wp_redirect(get_bloginfo('url'), 301);   
  21.     }   
  22. }else{   
  23.     //無 ID 則重定向到首頁   
  24.     wp_redirect(get_bloginfo('url'), 301);   
  25. } ?>  

至於除錯方法,可在 go.php 中將跳轉程式碼去掉,隨意輸出一點內容,先看是否能重定向到 go.php
如果能重定向到 go.php,則問題出在 go.php 中的程式碼。

跟正:之前由於工作不嚴謹,忘記本工作的自定義欄位在儲存的時候會將欄位中的 html 字元轉換為 html 實體再儲存,比如符號& 會被轉換為&amp;   於是有網友提出一些含有& 的推廣連結無法跳轉,由於測試的時候只是隨便弄了個網址測試,導致 bug 出現。

解決方法,在獲取了跳轉連結的欄位之後,使用 htmlspecialchars_decode 函式將 html 實體再轉換為 html 字元......