WordPress上一个和下一个按钮排除多个类别

时间:2011-11-05 17:49:57

标签: php wordpress categories

我有一个WordPress博客,其中的帖子有多个类别被选中。我在每个帖子的底部使用“上一篇文章”和“下一篇文章”按钮。我希望下一篇或上一篇文章属于同一类别 - wordpress允许在next_post_linkprevious_post_link函数中使用此参数,但是当您有多个类别时它会变得复杂 - 它选择类别ID最低的类别,这会导致后期导航不一致。

我想要做的是从固定链接获取帖子类别,格式为/%category%/%postname%然后获取所有类别的数组,从该数组中删除当前帖子类别,然后排除该数组从下一个和上一个帖子链接,实际上只留下当前类别(由永久链接指示)。例如,如果永久链接是“myurl.com/music/september-guitar-post”,我想从上一个和下一个帖子链接中排除音乐之外的所有类别。

这是我正在使用的代码(似乎没有按照我想要的方式运行):

function remove_item_by_value($array, $val = '', $preserve_keys = true) {
    if (empty($array) || !is_array($array)) return false;
    if (!in_array($val, $array)) return $array;

    foreach($array as $key => $value) {
        if ($value == $val) unset($array[$key]);
    }

    return ($preserve_keys === true) ? $array : array_values($array);
}

$link = get_permalink();
$link = explode('/',$link);
$currentCat = $link[3];
$currentCat = get_category_by_slug( $currentCat );
$currentCatId = $currentCat->term_id;
$categories = get_categories();
foreach($categories as $category) {
    $catList[] = $category->term_id;
}

$exclude = remove_item_by_value($catList, $currentCatId);
$exclude = implode(' and ',$exclude);

previous_post_link('%link', '« Previous post', TRUE, $exclude);
next_post_link('%link', '« Previous post', TRUE, $exclude);

所有代码都有效,直到尝试将$ exclude字符串用作next / prev post链接函数中的参数。进一步测试后,只是尝试排除单个类别似乎不起作用(next_post_link('%link', '« Previous post', TRUE, '3'))。任何人都可以确认这个代码实际上是如文档所说的那样起作用吗?

我如何使这项工作?

谢谢!

3 个答案:

答案 0 :(得分:1)

根据next_page_linkDocs,您需要将排除的类别作为包含由" and "分隔的ID的字符串传递:

$exclude = implode(' and ', $exclude);
next_post_link('%link', '« Previous post', TRUE, $exclude);
previous_post_link('%link', '« Previous post', TRUE, $exclude);

如果文档没有说谎,这应该可行。

答案 1 :(得分:1)

请注意您输入要排除的类别的所有四个位置。 示例id是id = 10 id = 20 id = 30

//Exclude Categories From Previous/Next
function custom_prev_next_posts() { 
global $thesis_design; 

if (is_single() && $thesis_design->display['posts']['nav']) { 
    $previous = get_previous_post(FALSE,'10,20,30'); 
    $next = get_next_post(FALSE,'10,20,30'); 
    $previous_text = apply_filters('thesis_previous_post', __('Previous entry: ',  'thesis')); #filter 
    $next_text = apply_filters('thesis_next_post', __('Next entry: ', 'thesis'));   #filter 

    if ($previous || $next) { 
        echo "\t\t\t\t\t<div class=\"prev_next post_nav\">\n"; 

        if ($previous) { 
            if ($previous && $next) 
                $add_class = ' class="previous"'; 

            echo "\t\t\t\t\t\t<p$add_class>$previous_text"; 
            previous_post_link('%link', '%title',FALSE,'10,20,30'); 
            echo "</p>\n"; 
        } 

        if ($next) { 
            echo "\t\t\t\t\t\t<p>$next_text"; 
            next_post_link('%link', '%title',FALSE,'10,20,30'); 
            echo "</p>\n"; 
        } 

        echo "\t\t\t\t\t</div>\n"; 
    } 
  } 
} 

add_action('wp_hook_after_content', 'custom_prev_next_posts'); 
remove_action('wp_hook_after_content', 'wp_prev_next_posts');  

答案 2 :(得分:0)

从下面的文档中可以看出,exclude参数必须是“1和2和3”形式的字符串(不是数组),其中1,2,3是示例类别ID。看起来您需要从当前尝试用作参数的数组中构建此字符串。

http://codex.wordpress.org/Function_Reference/previous_post_link