我在WordPress后台某篇文章的编辑页面,给这篇文章选择了分类:WordPress,接着同时选择了标签:php、主题制作,这时分类(WordPress)就与标签(php、主题制作)建立了关联,利用这种关联我们实现很多种需求,最典型的是细化WordPress文章分类功能,在子分类无法达到我们的需求时,可以使用标签来细化。我只需要提供WordPress分类的id,就可以得到它关联的标签:php、主题制作。
调用函数
我们可以先在主题目录的下的functions.php添加以下函数:
1 |
<span class="kw2">function</span> mobantu_get_category_tags<span class="br0">(</span><span class="re0">$args</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw2">global</span> <span class="re0">$wpdb</span><span class="sy0">;</span> <span class="re0">$tags</span> <span class="sy0">=</span> <span class="re0">$wpdb</span><span class="sy0">-></span><span class="me1">get_results</span> <span class="br0">(</span><span class="st0">" SELECT DISTINCT terms2.term_id as tag_id, terms2.name as tag_name FROM <span class="es4">$wpdb->posts</span> as p1 LEFT JOIN <span class="es4">$wpdb->term_relationships</span> as r1 ON p1.ID = r1.object_ID LEFT JOIN <span class="es4">$wpdb->term_taxonomy</span> as t1 ON r1.term_taxonomy_id = t1.term_taxonomy_id LEFT JOIN <span class="es4">$wpdb->terms</span> as terms1 ON t1.term_id = terms1.term_id, <span class="es4">$wpdb->posts</span> as p2 LEFT JOIN <span class="es4">$wpdb->term_relationships</span> as r2 ON p2.ID = r2.object_ID LEFT JOIN <span class="es4">$wpdb->term_taxonomy</span> as t2 ON r2.term_taxonomy_id = t2.term_taxonomy_id LEFT JOIN <span class="es4">$wpdb->terms</span> as terms2 ON t2.term_id = terms2.term_id WHERE t1.taxonomy = 'category' AND p1.post_status = 'publish' AND terms1.term_id IN ("</span><span class="sy0">.</span><span class="re0">$args</span><span class="br0">[</span><span class="st_h">'categories'</span><span class="br0">]</span><span class="sy0">.</span><span class="st0">") AND t2.taxonomy = 'post_tag' AND p2.post_status = 'publish' AND p1.ID = p2.ID ORDER by tag_name "</span><span class="br0">)</span><span class="sy0">;</span> <span class="re0">$count</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span><span class="re0">$tags</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">foreach</span> <span class="br0">(</span><span class="re0">$tags</span> <span class="kw1">as</span> <span class="re0">$tag</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$mytag</span><span class="br0">[</span><span class="re0">$count</span><span class="br0">]</span> <span class="sy0">=</span> get_term_by<span class="br0">(</span><span class="st_h">'id'</span><span class="sy0">,</span> <span class="re0">$tag</span><span class="sy0">-></span><span class="me1">tag_id</span><span class="sy0">,</span> <span class="st_h">'post_tag'</span><span class="br0">)</span><span class="sy0">;</span> <span class="re0">$count</span><span class="sy0">++;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span> <span class="re0">$mytag</span> <span class="sy0">=</span> <span class="kw4">NULL</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">return</span> <span class="re0">$mytag</span><span class="sy0">;</span> <span class="br0">} </span> |
函数用法
然后在其他主题文件中,我们可以调用某个分类或某几个分类关联的标签:
1 |
<span class="co1">// 12,13是分类ID,多个用半角逗号隔开</span> <span class="re0">$args</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span> <span class="st_h">'categories'</span> <span class="sy0">=></span> <span class="st_h">'12,13'</span><span class="br0">)</span><span class="sy0">;</span> <span class="co1">// 调用上面定义的函数,来获取ID为12,13的分类的关联标签</span> <span class="re0">$tags</span> <span class="sy0">=</span> mobantu_get_category_tags<span class="br0">(</span><span class="re0">$args</span><span class="br0">)</span><span class="sy0">;</span> <span class="co1">// 输出我们获取到的关联标签,以列表形式打印</span> <span class="re0">$content</span> <span class="sy0">.=</span> <span class="st0">"<ul>"</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">(</span><span class="re0">$tags</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">foreach</span> <span class="br0">(</span><span class="re0">$tags</span> <span class="kw1">as</span> <span class="re0">$tag</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$content</span> <span class="sy0">.=</span> <span class="st0">"<li><a href=<span class="es1">"</span>"</span><span class="sy0">.</span>get_tag_link<span class="br0">(</span><span class="re0">$tag</span><span class="sy0">-></span><span class="me1">term_id</span><span class="br0">)</span><span class="sy0">.</span><span class="st0">"<span class="es1">"</span>>"</span><span class="sy0">.</span><span class="re0">$tag</span><span class="sy0">-></span><span class="me1">name</span><span class="sy0">.</span><span class="st0">"</a></li>"</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="re0">$content</span> <span class="sy0">.=</span> <span class="st0">"</ul>"</span><span class="sy0">;</span> <span class="kw1">echo</span> <span class="re0">$content</span><span class="sy0">; </span> |
好了,基本用法就这些,具体其他用法你可以自由地进行扩展。
获取某个标签关联的分类
反过来,我们可能会有这样的需求,既然可以获取某个分类的关联标签,那我能获取某个标签的关联分类吗?答案是可以的,将上面的代码稍微改一下就可以了:
1 |
<span class="kw2">function</span> mobantu_get_tag_categories<span class="br0">(</span><span class="re0">$args</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw2">global</span> <span class="re0">$wpdb</span><span class="sy0">;</span> <span class="re0">$categories</span> <span class="sy0">=</span> <span class="re0">$wpdb</span><span class="sy0">-></span><span class="me1">get_results</span> <span class="br0">(</span><span class="st0">" SELECT DISTINCT terms1.term_id as cat_id FROM <span class="es4">$wpdb->posts</span> as p1 LEFT JOIN <span class="es4">$wpdb->term_relationships</span> as r1 ON p1.ID = r1.object_ID LEFT JOIN <span class="es4">$wpdb->term_taxonomy</span> as t1 ON r1.term_taxonomy_id = t1.term_taxonomy_id LEFT JOIN <span class="es4">$wpdb->terms</span> as terms1 ON t1.term_id = terms1.term_id, <span class="es4">$wpdb->posts</span> as p2 LEFT JOIN <span class="es4">$wpdb->term_relationships</span> as r2 ON p2.ID = r2.object_ID LEFT JOIN <span class="es4">$wpdb->term_taxonomy</span> as t2 ON r2.term_taxonomy_id = t2.term_taxonomy_id LEFT JOIN <span class="es4">$wpdb->terms</span> as terms2 ON t2.term_id = terms2.term_id WHERE t1.taxonomy = 'category' AND p1.post_status = 'publish' AND terms2.term_id IN ("</span><span class="sy0">.</span><span class="re0">$args</span><span class="br0">[</span><span class="st_h">'tags'</span><span class="br0">]</span><span class="sy0">.</span><span class="st0">") AND t2.taxonomy = 'post_tag' AND p2.post_status = 'publish' AND p1.ID = p2.ID ORDER by cat_id "</span><span class="br0">)</span><span class="sy0">;</span> <span class="re0">$count</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span><span class="re0">$categories</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">foreach</span> <span class="br0">(</span><span class="re0">$categories</span> <span class="kw1">as</span> <span class="re0">$category</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$mycategory</span><span class="br0">[</span><span class="re0">$count</span><span class="br0">]</span> <span class="sy0">=</span> get_term_by<span class="br0">(</span><span class="st_h">'id'</span><span class="sy0">,</span> <span class="re0">$category</span><span class="sy0">-></span><span class="me1">cat_id</span><span class="sy0">,</span> <span class="st_h">'category'</span><span class="br0">)</span><span class="sy0">;</span> <span class="re0">$count</span><span class="sy0">++;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span> <span class="re0">$mycategory</span> <span class="sy0">=</span> <span class="kw4">NULL</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">return</span> <span class="re0">$mycategory</span><span class="sy0">;</span> <span class="br0">}</span> |
调用范例
1 |
<span class="co1">// 12,13是标签ID,多个用半角逗号隔开</span> <span class="re0">$args</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span> <span class="st_h">'tags'</span> <span class="sy0">=></span> <span class="st_h">'12,13'</span><span class="br0">)</span><span class="sy0">;</span> <span class="co1">// 调用上面定义的函数,来获取ID为12,13的标签的关联分类</span> <span class="re0">$categories</span> <span class="sy0">=</span> mobantu_get_tag_categories<span class="br0">(</span><span class="re0">$args</span><span class="br0">)</span><span class="sy0">;</span> <span class="co1">// 输出我们获取到的关联分类,以列表形式打印</span> <span class="re0">$content</span> <span class="sy0">.=</span> <span class="st0">"<ul>"</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">(</span><span class="re0">$categories</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">foreach</span> <span class="br0">(</span><span class="re0">$categories</span> <span class="kw1">as</span> <span class="re0">$category</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$content</span> <span class="sy0">.=</span> <span class="st0">"<li><a href=<span class="es1">"</span>"</span><span class="sy0">.</span>get_category_link<span class="br0">(</span> <span class="re0">$category</span><span class="sy0">-></span><span class="me1">term_id</span> <span class="br0">)</span><span class="sy0">.</span><span class="st0">"<span class="es1">"</span>>"</span><span class="sy0">.</span><span class="re0">$category</span><span class="sy0">-></span><span class="me1">name</span><span class="sy0">.</span><span class="st0">"</a></li>"</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="re0">$content</span> <span class="sy0">.=</span> <span class="st0">"</ul>"</span><span class="sy0">;</span> <span class="kw1">echo</span> <span class="re0">$content</span><span class="sy0">;</span> |
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。