Last updated March 26, 2011. Created by Darren Oh on August 9, 2007.
Edited by linclark, add1sun, sgware. Log in to edit this page.
This code was very helpful for me, so I thought I should post it here for others to use.
This is PHP code to be placed in "Argument Handling Code" under "Arguments" in a taxonomy_term View that takes Term ID as its first argument.
Context: The site I wrote this for is a blog with multiple categories. The categories are implemented via a required, controlled, single vocabulary... so in other words each blog post has exactly one category. I am not sure what this code will do with other sorts of vocabularies. Feel free to post a comment if you try it out.
What it does:
- Provides an 'all' option so that 'example.com/taxonomy/all' will show you nodes for all taxonomy terms in the vocabulary (vid=1)
- Use taxonomy term id's or term names interchangeably (so you could do 'example.com/taxonomy/Some Category+2+3+Last Category')
- Perform AND queries with taxonomy term names, even if they have spaces
(Views does not allow you to do taxonomy queries in the form of 'example.com/taxonomy/CatA+CatB+CatC'... you can only do 'example.com/taxonomy/CatA'. Also, if you do 'example.com/taxonomy/First Category', 'First' and 'Category' will be separated even if you have a taxonomy term by that name. This code fixes that.)
- Will not mess up RSS feeds (So in other words you still get the RSS feed associated with whatever taxonomy query you are using)
Bugs/Issues: Because my site was using a singular controlled grammar, OR queries (,) will never be needed. All I need are AND queries (+), so if you try 'example.com/taxonomy/First Category,2,3,Last Category', this code will not work and will probably mess up your page. Maybe I will add this in later. Feel free to post the modified code if you want to add this feature.
$vocab = taxonomy_get_tree(1);
// Convert 'All' into Every Category Name
if($args[0]=='All' || $args[0]=='all'){
$args[0] = '';
foreach($vocab as $myterm){
$args[0] .= $myterm->name . '+';
}
$args[0] = substr($args[0], 0, strlen($args[0])-1);
}
else{
$urltp = $_SERVER['REQUEST_URI'];
for($i=1; $i<sizeof($args); $i++){
$urltp = dirname($urltp);
}
$args[0] = str_replace('%2B', '+', substr($urltp, strripos($urltp, '/')+1));
}
// Convert Term Names into tid's
$names = explode('+', $args[0]);
$args[0] = '';
foreach($names as $n){
if(is_numeric($n)) $args[0] .= $n . '+';
else{
foreach($vocab as $term){
$termname = strtolower(preg_replace('/[^a-zA-Z]*/', '', $term->name));
$givenname = strtolower(preg_replace('/[^a-zA-Z]*/', '', $n));
if($termname==$givenname){
$termid = $term->tid;
$args[0] .= $termid . '+';
}
}
}
}
$args[0] = substr($args[0], 0, strlen($args[0])-1);
// Return arguments
return $args;Edit the first line if you want to use a vocabulary other than vid 1.