wordpress进阶教程(二十八):站内链接跳转到外部链接

由于上次免费发布的一个主题,很多网友都说主题的推广跳转链接没有跳转,原因很多都是伪静态造成的,不管什么原因,现将实现跳转链接的教程先写出来,也许能给无法跳转的网友一点灵感。

我们需要的功能:站内的链接类似 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字符......

已有28条评论

  1. abc
    abc : 回复

    123

  2. 小浅
    小浅 : 回复

    亲爱的树~:
    wordpress更新到最新版本以后,用你的方法做的 go.php跳转就失效了,url重写也没作用,无论是下载的你用来测试的模板,还是用你的方法写成的新的go.php,都没用。都会在go/前面出现本站域名导致无法跳转。
    点击后就变成了:http://localhost/buy/go/www.ashuwp.com
    这样的。
    from 苦恼的小白

  3. lomee
    lomee : 回复

    请问怎么添加多个跳转。 比如两个跳转页面。

  4. 怎么省钱网
    怎么省钱网 : 回复

    如何做到全站外部链接全部转内链跳转

  5. 小兰姐姐
    小兰姐姐 : 回复

    哇哈哈我直接在分享的板子里抠出来了<div class=”zhida” id=”buy_url_<?php echo $post->ID?>”>
    <a href=”<?php echo home_url(‘/’);?>go/<?php echo $post->ID?>” rel=”nofollow” class=”border_radius_3″ target=”_blank”>直 达 链 接</a>
    <div style=”display:none”></div>  就这一段等一下写CSS搞一下就OK

    • 好好先生
      好好先生 回复小兰姐姐: 回复

      请问是怎么改的,我在excerpt.php总加了这段代码,在文章自定义项里输入了buy_url_和链接,然后点击直达就是not found/go/xx ,请问这个链接是指向哪的,需要怎么修改一下吗

  6. 小兰姐姐
    小兰姐姐 : 回复

    找到办法了用自定义字段插件定义了一个_buy_link      然后按照教程做完后手动输入的网址/go/24  就能跳转了  但是还有一个问题   /go/24 如何获取啊

  7. 小兰姐姐
    小兰姐姐 : 回复

    阿树你好问一下  模板那边咋个搞呢想做一个值得买那种 直达链接      刚下了一个你分享的主题出来在抠代码呢好痛苦  不知道我说清楚没

  8. fsfsafa
    fsfsafa : 回复

    _buy_link根本不能添加到自定义栏目,删除前面的_才能添加进去,但不起作用。

  9. wp主题
    wp主题 : 回复

    我弄去测试看看,自己研究一下

  10. 江林
    江林 : 回复

    第一种:通过js来跳转。如果没有链接,跳转到指定的链接,不是首页怎么写代码?

    • 阿树工作室
      阿树工作室 回复江林: 回复

      你是想?

  11. 牛仔裤家园
    牛仔裤家园 : 回复

    看到过一个解决方案和这个差不多,但是找不到了,这个可以吗?

  12. WordPress主题
    WordPress主题 : 回复

    请问,如果就用动态链接不用重新规则 应该怎么写呢?谢谢了

  13. WordPress主题
    WordPress主题 : 回复

    OK。谢谢了,带走啦。

  14. 老树
    老树 : 回复

    我还没大明白,添加自定义栏目不起作用啊

  15. 恋秋
    恋秋 : 回复

    能不能实现文章内所有的外部链接全部跳转呢?不使用自定义字段。发布文章的时候可以随意发布外链,而阅读文章的时候所有的外链则变成站内链接跳转。像这个网站的效果一样?chong4.com.cn

  16. 小鱼
    小鱼 : 回复

    还请老大帮忙,如果文章中已添加自定义栏目如link,修改了之后也测试了,还是不能跳转,假如都定向到百度还是不跳,不知道要怎么修改了,请指教

  17. CY's BLOG
    CY's BLOG : 回复

    博主很多教程蛮经典~

    • CY's BLOG
      CY's BLOG 回复CY's BLOG: 回复

      没大读懂,因为没搞过···问楼楼个问题:这几个代码能实现 文章中外链自动转内链么?

      本人有个淘客站,里头大量的跳转链接~

  18. 好店品
    好店品 : 回复

    发现可以跳转,但是添加亿起发之后,跳转到后的网址不是亿起发的起作用的网址;

    • 阿树工作室
      阿树工作室 回复好店品: 回复

      本人测试可以跳转。。。

  19. 啊牛
    啊牛 : 回复

    发现转跳到亿起发之类的链接,不能,直接就到亿起发首页了。

    • 阿树工作室
      阿树工作室 回复啊牛: 回复

      本人测试,亿起发链接能用…

      • 啊牛
        啊牛 回复阿树工作室: 回复

        自己再次检查了下看,是原链接本身就存在问题,麻烦楼主了。

  20. 网
    : 回复

    大神,教下怎么增加_buy_link的自定义字段,实在没这样方面的基础

  21. Blade
    Blade : 回复

    如果一篇文章上有多个跳转网址该怎样弄呢

  22. 恋秋
    恋秋 : 回复

    在网上找了很久,都没有找到相关资料,多谢阿树提供的教程

发表评论