За последние 24 часа нас посетили 6596 программистов и 529 роботов. Сейчас ищут 198 программистов ...

Листать посты следующий предыдущий

Тема в разделе "Wordpress", создана пользователем green8555, 22 авг 2018.

  1. green8555

    green8555 Новичок

    С нами с:
    22 авг 2018
    Сообщения:
    3
    Симпатии:
    0
    Помогите люди добрые, сами мы не местные!
    хочется получить такой результат: посты (записи) надо, чтобы попадали в ссылки следующий предыдущий только из той категории к которой принадлежит просматриваемый пост, в свою очередь пост может принадлежать нескольким категориям, но нужно посты листать в той категории которая прописана в url (domain.ru/category-name/super-post/). Другими словами нужно получать следующий и предыдущий посты у которых в URL есть тоже category-name

    сейчас в шаблоне такой код
    Код (Text):
    1.  ?>
    2.     <?php
    3.     $prevPost = get_previous_post(true); // false = all categories
    4.     if ($prevPost) {
    5.         $args = array(
    6.             'posts_per_page' => 10,
    7.             'include' => $prevPost->ID
    8.         );
    9.         $prevPost = get_posts($args);
    10.         foreach ($prevPost as $post) {
    11.             setup_postdata($prevPost);
    12.             ?>
    13.             <div class="post-previous tranz p-border">
    14.  
    15.                 <a href="<?php the_permalink($prevPost->ID); ?>" title="<?php the_title(); ?>"><i class="fa fa-chevron-left" aria-hidden="true"></i>&nbsp;<?php the_title(); ?></a>
    16.             </div>
    17.             <?php
    18.             wp_reset_postdata();
    19.         } //end foreach
    20.     } // end if
    21.  
    22.     $nextPost = get_next_post(true); // false = all categories
    23.     if ($nextPost) {
    24.         $args = array(
    25.             'posts_per_page' => 10,
    26.             'include' => $nextPost->ID
    27.         );
    28.         $nextPost = get_posts($args);
    29.         foreach ($nextPost as $post) {
    30.             setup_postdata($nextPost);
    31.             ?>
    32.             <div class="post-next tranz p-border">
    33.                 <a href="<?php the_permalink($nextPost->ID); ?>" title="<?php the_title(); ?>"><?php the_title(); ?>&nbsp;<i class="fa fa-chevron-right" aria-hidden="true"></i></a>
    34.  
    35.  
    36.             </div>
    37.             <?php
    38.             wp_reset_postdata();
    39.         } //end foreach
    40.     }
    41.     ?>
    42. </div>
     
  2. oolleegg55

    oolleegg55 Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    17
    Симпатии:
    2
    Дисклеймер: мой ответ дискуссионный, а не окончательное решение.

    Я думаю, тут нужно использовать обычные функции WP для постраничной навигации: https://codex.wordpress.org/Next_and_Previous_Links
    Для получения предыдущей страницы: previous_post_link() и для следующей: next_post_link(). Или их собратьев.

    Проблема, в том, что вашего результата без бубна, похоже не добиться. Или я гуглил плохо :). По крайней мере, я на нашел решения, которое на занимало несколько страниц.

    Так вот, указанным функциям нельзя просто сказать, дай предыдущую (или следующую) страницу вот такого term, хотя при этом можно указать taxonomy. Но там есть параметр excluded_terms, который нам поможет.

    Я напишу алгоритм и код сразу. Вот что я придумал:

    Получаем текущую категорию по URL:
    PHP:
    1. $slugs = explode('/', get_query_var('category_name'));
    2. $current_category = get_category_by_slug('/'.end($slugs));
    Получаем все termы нужной таксономии:
    PHP:
    1. $terms = get_terms( array(
    2.    'taxonomy' => 'category',
    3. ) );
    Зная уже так много, мы готовим termы для исключения:

    PHP:
    1. $excluded_terms = [];
    2. foreach ( $terms as $term ) {
    3.    if ( $term->term_id != $current_category->term_id ) {
    4.       array_push( $excluded_terms, $term->term_id );
    5.    }
    6. }
    И финал, добавляем наши навигационные ссылки:

    PHP:
    1. previous_post_link( '&laquo; %link', '%title', true, $excluded_terms );
    2. next_post_link( '%link &raquo;', '%title', true, $excluded_terms );
    Я попробовал на кошках, у меня все работает как нужно.
     
  3. oolleegg55

    oolleegg55 Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    17
    Симпатии:
    2
    Да, уже в get_terms можно исключить текущий term, тогда foreach не понадобится.
     
  4. green8555

    green8555 Новичок

    С нами с:
    22 авг 2018
    Сообщения:
    3
    Симпатии:
    0
    Не не, посты могут принадлежать нескольким категориям которые исключаются.
     
  5. green8555

    green8555 Новичок

    С нами с:
    22 авг 2018
    Сообщения:
    3
    Симпатии:
    0
    готово!
    Код (Text):
    1.  
    2. <div id="post-nav" class="p-border">
    3.     <?php
    4.     $link = get_the_permalink();
    5.     $slugs = parseCatPostURL($link);// тут просто выдираю название категории!  простейший метод на explode()
    6.    
    7.     $current_category = get_category_by_slug($slugs);
    8.    
    9.  
    10.    
    11.    
    12.    
    13.  
    14.    
    15.   $g=get_the_ID();
    16.   $t=$current_category->term_id;
    17.   $posts = $wpdb->get_results("SELECT  `ID`,`post_date`,`slug`, `post_title`,`post_date`, `post_content`
    18. FROM `wp_terms` AS `t1`
    19. INNER JOIN `wp_term_taxonomy` AS `t2` ON t1.term_id=t2.term_id
    20. INNER JOIN `wp_term_relationships`AS t3 ON t2.term_taxonomy_id=t3.term_taxonomy_id
    21. INNER JOIN `wp_posts` AS t4 ON t4.ID=t3.object_id
    22. INNER JOIN `wp_postmeta` AS t7 ON t4.ID=t7.post_id
    23. WHERE t2.taxonomy='category' AND t1.term_id={$t} AND t4.post_status='publish' AND t4.ID<{$g} and meta_value in (SELECT meta_value FROM `wp_postmeta` WHERE `post_id`={$g} and `meta_key`=\"_category_permalink\")
    24. ORDER BY t4.post_date DESC
    25. LIMIT 1");
    26.     if (count($posts) > 0) {
    27.         ?>
    28.         <div class="post-previous tranz p-border">
    29.             <a href="<?php echo the_permalink($posts[0]->ID); ?>
    30.                " title="<?php echo $posts[0]->post_title ?>">
    31.                 <i class="fa fa-chevron-left" aria-hidden="true"></i>&nbsp;
    32.                     <?php echo $posts[0]->post_title ?></a>
    33.         </div>
    34.  
    35.         <?php
    36.     }else{
    37.         ?>
    38.             <div class="post-previous tranz p-border"> &nbsp</div>
    39.             <?php
    40.     }
    41.  
    42.  
    43.  
    44.    
    45.    
    46.     $posts = $wpdb->get_results("SELECT  `ID`,`post_date`,`slug`, `post_title`,`post_date`, `post_content`
    47. FROM `wp_terms` AS `t1`
    48. INNER JOIN `wp_term_taxonomy` AS `t2` ON t1.term_id=t2.term_id
    49. INNER JOIN `wp_term_relationships`AS t3 ON t2.term_taxonomy_id=t3.term_taxonomy_id
    50. INNER JOIN `wp_posts` AS t4 ON t4.ID=t3.object_id
    51. INNER JOIN `wp_postmeta` AS t7 ON t4.ID=t7.post_id
    52. WHERE t2.taxonomy='category' AND t1.term_id={$t} AND t4.post_status='publish' AND t4.ID>{$g} and meta_value in (SELECT meta_value FROM `wp_postmeta` WHERE `post_id`={$g} and `meta_key`=\"_category_permalink\")
    53. ORDER BY t4.post_date ASC
    54. LIMIT 1");
    55.     if (count($posts) > 0) {
    56.         ?>
    57.         <div class="post-next tranz p-border">
    58.             <a href="<?php echo the_permalink($posts[0]->ID); ?>
    59.                " title="<?php echo $posts[0]->post_title ?>">
    60.                 <?php echo $posts[0]->post_title ?> &nbsp;<i class="fa fa-chevron-right" aria-hidden="true"></i>&nbsp;
    61.                     </a>
    62.         </div>
    63.  
    64.         <?php
    65.     }else{
    66.          ?>
    67.             <div class="post-next tranz p-border"> &nbsp</div>
    68.             <?php
    69.     }
    70.  
    71.  
    72.   ?>
    73. </div>