由於上次免費發佈的一個主題,很多網友都説主題的推廣跳轉鏈接沒有跳轉,原因很多都是偽靜態造成的,不管什麼原因,現將實現跳轉鏈接的教程先寫出來,也許能給無法跳轉的網友一點靈感。
我們需要的功能:站內的鏈接類似 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): 添加一個重寫規則,構建新頁面初試前後的幾篇文章。
- //為不帶 http 的地址添加 http
- function addhttp($url) {
- if (!preg_match("~^(?:f|ht)tps?://~i", $url)) {
- $url = "http://" . $url;
- }
- return $url;
- }
- /********添加 query 變量************/
- function ashuwp_query_vars($public_query_vars) {
- $public_query_vars[] = 'my_custom_page_type';
- $public_query_vars[] = 'pid';
- return $public_query_vars;
- }
- /************重寫規則*************/
- function ashuwp_rewrite_rules( $wp_rewrite ){
- $new_rules = array(
- 'go/?([0-9]{1,})/?$' => 'index.php?my_custom_page_type=buy_page&pid='.$wp_rewrite->preg_index(1),
- );
- $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
- }
- /************模板載入規則****************/
- function ashuwp_template_redirect(){
- global $wp,$wp_query,$wp_rewrite;
- if( !isset($wp_query->query_vars['my_custom_page_type']) )
- return;
- $reditect_page = $wp_query->query_vars['my_custom_page_type'];
- if ($reditect_page == "buy_page"){
- include(get_template_directory().'/go.php');
- die();
- }
- }
- /*********更新重寫規則***************/
- function ashuwp_flush_rewrite_rules() {
- global $pagenow, $wp_rewrite;
- if ( 'themes.php' == $pagenow && isset( $_GET['activated'] ) )
- $wp_rewrite->flush_rules();
- }
- add_action( 'load-themes.php', 'ashuwp_flush_rewrite_rules' ); //啓用主題的時候
- add_action('generate_rewrite_rules', 'ashuwp_rewrite_rules' ); //添加重寫規則
- add_action('query_vars', 'ashuwp_query_vars');
- 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 來跳轉。
- <?php
- /*******跳轉模板*******/
- global $wp_rewrite,$wp_query;
- //從請求的地址中獲取文章 ID
- if( isset($wp_query->query_vars['pid']) && $wp_query->query_vars['pid']!='' )
- $post_id = $wp_query->query_vars['pid'];
- else
- $post_id = 0;
- //如果文章 ID 存在
- if( $post_id ){
- //通過文章 ID 獲取要跳轉的站外鏈接--自定義字段
- $buy_link = get_post_meta($post_id,'_buy_link',true);
- $buy_link = htmlspecialchars_decode($buy_link);//將 html 實體換回預定義字符
- $buy_link = trim($buy_link);
- $buy_link = addhttp(trim($buy_link));
- if($buy_link){ ?>
- <?php //跳轉到對應的鏈接?>
- <script type="text/javascript">window.location.href="<?php echo $buy_link;?>";</script>
- <?php }else{ ?>
- <?php //如果沒有設置跳轉到奧首頁?>
- <script type="text/javascript">window.location.href="<?php echo home_url();?>";</script>
- <?php }
- }else{ ?>
- <?php //無 ID 則跳轉到首頁 ?>
- <script type="text/javascript">window.location.href="<?php echo home_url();?>";</script>
- <?php } ?>
第二種,使用 wp_redirect 函數
- <?php
- /*******跳轉模板*******/
- global $wp_rewrite,$wp_query;
- //從請求的地址中獲取文章 ID
- if( isset($wp_query->query_vars['pid']) && $wp_query->query_vars['pid']!='' )
- $post_id = $wp_query->query_vars['pid'];
- else
- $post_id = 0;
- if( $post_id ){
- //獲取跳轉鏈接
- $buy_link = get_post_meta($post_id,'_buy_link',true);
- $buy_link = htmlspecialchars_decode($buy_link);//將 html 實體換回預定義字符
- $buy_link = trim($buy_link);
- $buy_link = addhttp(trim($buy_link));
- if($buy_link){
- //跳轉
- wp_redirect($buy_link, 301);
- }else{
- //跳轉到首頁
- wp_redirect(get_bloginfo('url'), 301);
- }
- }else{
- //無 ID 則重定向到首頁
- wp_redirect(get_bloginfo('url'), 301);
- } ?>
至於調試方法,可在 go.php 中將跳轉代碼去掉,隨意輸出一點內容,先看是否能重定向到 go.php
如果能重定向到 go.php,則問題出在 go.php 中的代碼。
跟正:之前由於工作不嚴謹,忘記本工作的自定義字段在保存的時候會將字段中的 html 字符轉換為 html 實體再保存,比如符號& 會被轉換為& 於是有網友提出一些含有& 的推廣鏈接無法跳轉,由於測試的時候只是隨便弄了個網址測試,導致 bug 出現。
解決方法,在獲取了跳轉鏈接的字段之後,使用 htmlspecialchars_decode 函數將 html 實體再轉換為 html 字符......