Кнопка «Предыдущая» и «Следующая» WordPress исключает несколько категорий - PullRequest
3 голосов
/ 05 ноября 2011

У меня есть блог на WordPress, где посты имеют несколько категорий. Я использую кнопки «Предыдущая запись» и «Следующая запись» внизу каждого сообщения. Я хотел бы, чтобы следующий или предыдущий пост был в той же категории - WordPress допускает этот параметр в функциях next_post_link и previous_post_link, однако это усложняется, когда у вас более одной категории - он выбирает категорию с помощью самый низкий идентификатор категории, что приводит к непоследовательности пост-навигации.

Что я хочу сделать, так это получить категорию поста из постоянной ссылки, которая отформатирована как /% 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_post_link('%link', '« Previous post', TRUE, '3')), например. Кто-нибудь может подтвердить, что этот код действительно функционирует так, как написано в документации?

Как мне сделать эту работу?

Спасибо!

Ответы [ 3 ]

1 голос
/ 16 апреля 2012

Отметьте все четыре места, где вы вводите свои категории, которые будут исключены. Идентификаторы примера: 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');  
1 голос
/ 05 ноября 2011

Согласно next_page_link Документам необходимо передать исключенные категории в виде строки, содержащей идентификаторы, разделенные " and ":

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

Если документация не врет, это должно сработать.

0 голосов
/ 05 ноября 2011

Из документации ниже видно, что параметр exclude должен быть строкой (а не массивом) в форме "1 и 2 и 3", где 1, 2, 3 являются примерами идентификаторов категорий. Похоже, вам нужно построить эту строку из массива, который вы сейчас пытаетесь использовать в качестве аргумента.

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

...