> WordPress中文手册 > wordpress进阶教程(二十八):站内链接跳转到外部链接

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

我们需要的功能:站内的链接类似 http://dba.cn/go/111   这种类型的地址,点击进去跳转到一个站外链接,其中前面的111为文章ID,要跳转的站外链接由文章的自定义字段添加。

实现方法:所有 http://dba.cn/go/xxx 这种类型的链接由主题中的 go.PHP文件中处理,然后通过地址中的文章ID,获取到要跳转的站外链接,通过WordPress的wp_redirect函数跳转或者输出js实现跳转。

 

步骤一、添加外部链接

先给文章添加一个自定义字段用来输入一个要跳转的站外链接,比如淘宝客的推广链接,自定义字段的添加可以通过本工作室提供的自定义字段类文件实现:wordpress进阶教程(十):后台创建自定义面板类文件,当然你也可以通过文章编辑器下面的自定义栏目添加,如图(我们添加了一个名为_buy_link的自定义字段,用来输入我们的推广链接):wordpress进阶教程(二十八):站内链接跳转到外部链接
步骤二、将站内链接重写到主题的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');   <?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 } ?>    <?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);    } ?>  

上面的代码将站内所有类似 http://dba.cn/go/xxx 这种地址重写载入go.php文件来处理。

很多不支持伪静态,或者伪静态没设置好的主机,访问不了类似http://dba.cn/go/xxx这种静态地址,所有无法重写此类url,判断伪静态是否可用,只需在  后台设置->固定连接  将固定连接结构任意设置一种(非默认的http://dba.cn/?p=123这种即可),然后任意找一篇文章查看,如果正常访问,则伪静态基本无问题。

 

步骤三、添加go.php中的跳转代码。

提供两种方式,任选一种即可。

第一种:通过js来跳转。

//为不带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');   <?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 } ?>    <?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);    } ?>  

第二种,使用wp_redirect函数

//为不带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');   <?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 } ?>    <?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实体再保存,比如符号&会被转换为&amp;   于是有网友提出一些含有&的推广链接无法跳转,由于测试的时候只是随便弄了个网址测试,导致bug出现。

解决方法,在获取了跳转链接的字段之后,使用htmlspecialchars_decode函数将html实体再转换为html字符......