網生@誌 | zEUS.'Blog

首页 » Wordpress研究 » 2012-12-25 »

WordPress 通过标签名(tag name)获取标签缩略名(tag slug)的方法

字体大小:T | T

新建了个相册类型网站 http://www.toycraft.cn/ 使用的是 iphoto 主题,非常喜欢它的照片墙效果,随着下拉滚动条可以在不翻页的情况下加载更多的内容,另外主题在 SEO 方面优化的也很好。不过使用过程中还是发现了个小 bug :

在 IE 浏览器下访问中文标签链接(比如:http://www.toycraft.cn/archives/tag/变形金刚),下拉滚动条后页面无法继续载入更多内容,但英文标签链接(比如:http://www.toycraft.cn/archives/tag/diy)则一切正常。

于是我就想到干脆直接把中文标签的别名也就是缩略名(slug)改为英文的:

修改 WordPress 标签别名

那么“变形金刚”的标签链接就会变为:http://www.toycraft.cn/archives/tag/transformers-toys 理论上这样就能解决问题,不过实际上访问这个链接后没有加载任何一篇文章。

想必问题是出在了主题文件中用于输出“标签页”和“分类页”的 archive.php ,观察发现主题作者通过以下代码获取当前的“分类缩略名”和“标签名”,并传入了变量 $name 中:

    if(is_category()){
    $cat_name = single_tag_title('',false);
    $cat_ID = get_cat_ID($cat_name);
    $cat = get_category($cat_ID);
    echo $name=$cat->slug;
    }
    else if(is_tag()){
    echo $name=single_tag_title('',false);
    }

获取了 $name 之后再通过以下代码输出当前分类或者标签下的文章列表:

    if(have_posts()) :
    $args = array($type => $name,'showposts'=>$prePage,'paged' => $paged);
    query_posts($args);	
    while (have_posts()) : the_post();

很明显,第一段代码中标签页 is_tag 的变量 $name 传入的是“标签名”而不是“标签缩略名(slug)”,导致第二段代码中 $name 传给 $type 的值是标签名(实际上需要的是缩略名),所以 query_posts 函数无法获得正确的参数,因而页面也无法加载出正确的文章。

那么现在需要解决的问题就是在已知标签名的情况下,来获取这个标签的缩略名(slug)。通过查阅 wordpress codex 文档,发现这里需要用到 get term by 函数

    <?php get_term_by( $field, $value, $taxonomy, $output, $filter ) ?>

参数说明:

  • $field:(字符串)(必需) ‘slug‘, ‘name‘, 或者’id‘,默认:’id‘
  • $value:(字符串|整数)(必需)指定字段的值,默认:None
  • $taxonomy:(字符串)(必需)分类名称,category, post_tag, 或者自定义的名称,默认:None
  • $output:(字符串)(可选)指定返回的类型, OBJECT, ARRAY_A, or ARRAY_N,默认:OBJECT
  • $filter:(字符串)(可选)指定过滤器,默认:‘raw‘

返回值:
(混合) 数据库中 term 的行记录。 $taxonomy 不存在或 $term 没有找到时,返回 false,返回的字段列表:

  • term_id
  • name
  • slug
  • term_group
  • term_taxonomy_id
  • taxonomy
  • description
  • parent
  • count

其中可选参数暂时不用管,我希望利用已知的 name 得到返回值为 slug ,那么代码可以这样写:

get_term_by('name', $tag_name, post_tag); //其中 $tag_name 为传入的变量

最后只用将第一段代码修改为:

    if(is_category()){
    $cat_name = single_tag_title('',false);
    $cat_ID = get_cat_ID($cat_name);
    $cat = get_category($cat_ID);
    echo $name=$cat->slug;
    }
    else if(is_tag()){  //如果是标签页
    $tag_name=single_tag_title('',false);  //获得标签名传入变量 $tag_name
    $tag_slug=get_term_by('name',$tag_name,'post_tag');  //通过标签名 $tag_name 获取与之相关的参数传入变量 $tag_slug
    echo $name=$tag_slug->slug;  //将变量 $tag_slug 中的 slug 传入变量 $name
    }

这样问题就解决了,无论是在分类页,还是标签页,变量 $name 的值都是缩略名(slug),它作为正确的参数再传入 query_posts() 函数,就能得到我需要的文章列表了。

参考文档:Function Reference/get term byFunction Reference/query postsFunction Reference/get categoryFunction Reference/get cat IDFunction Reference/single tag title

« »

发表您的看法

TOP COMMENTS BOTTOM