Отличный способ внутренней перелинковки статей (для WordPress)

Отличный способ внутренней перелинковки статей (для WordPress)

Евгений Самборский в своей статье «Как добиться хорошей индексации статей» рассказал про занятный способ внутренней перелинковки статей сайта. Суть метода заключается в том, что на страницу со статьей помещается блок «Предыдущие из рубрики» в котором публикуется несколько предыдущих статей из той же самой ...

Полезные комментарии (1)
Комментарии (156)
  1. 1

    Спасибо, Dimox! Я не ошибся, заглянув сразу на этот блог :) Так и знал, что найду здесь нужный код. На старом вп 2.3.3 работает идеально!

  2. 2
    OZ

    Кama, давно пользуюсь этим кодом и очень тебе благодарен. Вот появилась необходимость исключить из перелинковки одну категорию, можно ли это реализовать на твоем коде?

  3. 3
    OZ

    Было бы не плохо как то придумать вывод картинок вместе с ссылками..

  4. 4
    slavka78

    Воспользовался кодом Кama. Большое спасибо ему, ну и само собою автору блога

  5. 5

    Фуу, намучился я с этими вашими кодами, чуть сайт не снес…. )))) Но все-таки поставил как надо, поэтому спасибо вам большое!

  6. 6
    alex

    всем привет!
    подскажите пожалуйста какой код куда нужно вставлять или что на что заменить?
    спасибо

  7. 7
    Dez

    предыдущие посты — это хорошо.
    а как насчёт отображения следующих по списку постов (т.е. тех,которые наоборот новее)?

  8. 8
    Нурлан

    Поставил, все отлично работает. Если не секрет, подскажите, какой плагин у вас стойт слева экрана с кнопками соцсетей.

  9. 10

    спасибо за код, пригодился!

  10. 11

    Помогите плиз советом, реализовал такой код у себя на сайте и в той статье где оно есть, не отображаются ниже комментарии, после того как код убираю, отображаются. Очень прошу помощи, самому разобраться не получилось :(

  11. 15

    Епта! У меня не пашет просто тупо не выводит ничего,

    Не подскажешь в чем может быть дело может в базе данных таблицы не совпадают?

  12. 20

    Вот еще проблема. Я вывожу картинки и частично текст но он выводит по неправильному порядку.
    Т.е картинка принадлежит другому посту а он ее выводит совсем в другом посте.
    Вот код

    <?php
    function show_previous_posts_from_category ($the_post_id, $the_category_id = 0, $post_num) {
    
     $num = 0;
     global $wpdb;
    
     $sql = "SELECT wposts.*
     FROM $wpdb->posts wposts
     LEFT JOIN $wpdb->term_relationships ON (wposts.ID = $wpdb->term_relationships.object_id)
     LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
     WHERE $wpdb->term_taxonomy.taxonomy = 'category'
     AND $wpdb->term_taxonomy.term_id = '$the_category_id'
     AND wposts.post_status = 'publish'
     AND wposts.post_type = 'post'
     AND wposts.ID < '$the_post_id'
     ORDER BY wposts.ID DESC
     LIMIT $post_num";
    
     $result = $wpdb->get_results($sql, OBJECT);
     global $post;
    ?>
    
    <div class="related1">
    
    <ul class="recent">
    <h2>Предыдущие статьи из категории: <?php the_category( ', ' ) ?></h2>
    <?php
     foreach ($result as $post) {
    
     setup_postdata($post);
    ?>
     <li>-<a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></li>
    <? the_excerpt(); ?>
    <?php the_post_thumbnail(array(40,40)); ?>
    <?php
     $num++;
     $save_ids[] = $post->ID;
     }
     if ( $num < $post_num || !$result ) {
     $need_more = $post_num-$num;
     $save_ids[] = $the_post_id;
     $save_ids = join (',', $save_ids);
     $more_posts = get_posts("numberposts=$need_more&category=$the_category_id&exclude=$save_ids");
     foreach ($more_posts as $post){
    
     setup_postdata($post);
    ?>
     <li>-<a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a>
    <? the_excerpt(); ?>
    <?php the_post_thumbnail(array(40,40)); ?>
    </li>
    <?php
     }
     }
    ?>
    </ul>
    </div>
    <?php } ?>
    
    <?php
     $the_cat = get_the_category();
     $the_cat_id = $the_cat[0]->cat_ID;
     show_previous_posts_from_category($post->ID, $the_cat_id, 5);
     wp_reset_query();
    ?>
  13. 22

    А подскажите кто-нибудь, как можно вывести в этом коде миниатюру записи? Ну и может реально выводить первое предложение, как в плагине WP-Thumbie, только там перелинковки нет.

    • 23

      На

      <?php
      function show_previous_posts_from_category ($the_post_id, $the_category_id = 0, $post_num) {
      
       $num = 0;
       global $wpdb;
      
       $sql = "SELECT wposts.*
       FROM $wpdb->posts wposts
       LEFT JOIN $wpdb->term_relationships ON (wposts.ID = $wpdb->term_relationships.object_id)
       LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
       WHERE $wpdb->term_taxonomy.taxonomy = 'category'
       AND $wpdb->term_taxonomy.term_id = '$the_category_id'
       AND wposts.post_status = 'publish'
       AND wposts.post_type = 'post'
       AND wposts.ID < '$the_post_id'
       ORDER BY wposts.ID DESC
       LIMIT $post_num";
      
       $result = $wpdb->get_results($sql, OBJECT);
       global $post;
      ?>
      
      <div class="related1">
      
      <ul class="recent">
      <h2>Предыдущие статьи из категории: <?php the_category( ', ' ) ?></h2>
      <?php
       foreach ($result as $post) {
      
       setup_postdata($post);
      ?>
       <li>
      <?php the_post_thumbnail(array(40,40)); ?>
      <a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></li>
      <? the_excerpt(); ?>
      
      <?php
       $num++;
       $save_ids[] = $post->ID;
       }
       if ( $num < $post_num || !$result ) {
       $need_more = $post_num-$num;
       $save_ids[] = $the_post_id;
       $save_ids = join (',', $save_ids);
       $more_posts = get_posts("numberposts=$need_more&category=$the_category_id&exclude=$save_ids");
       foreach ($more_posts as $post){
      
       setup_postdata($post);
      ?>
       <li><?php the_post_thumbnail(array(40,40)); ?>
      <a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a>
      <? the_excerpt(); ?>
      
      </li>
      <?php
       }
       }
      ?>
      </ul>
      </div>
      <?php } ?>
      
      <?php
       $the_cat = get_the_category();
       $the_cat_id = $the_cat[0]->cat_ID;
       show_previous_posts_from_category($post->ID, $the_cat_id, 5);
       wp_reset_query();
      ?>
      
      
    • 25

      Окончательный вариант )))

      <?php
      function show_previous_posts_from_category ($the_post_id, $the_category_id = 0, $post_num) {
      function new_excerpt_length($length) {
      return 10; }
      add_filter('excerpt_length', 'new_excerpt_length');
      
       $num = 0;
       global $wpdb;
      
       $sql = "SELECT wposts.*
       FROM $wpdb->posts wposts
       LEFT JOIN $wpdb->term_relationships ON (wposts.ID = $wpdb->term_relationships.object_id)
       LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
       WHERE $wpdb->term_taxonomy.taxonomy = 'category'
       AND $wpdb->term_taxonomy.term_id = '$the_category_id'
       AND wposts.post_status = 'publish'
       AND wposts.post_type = 'post'
       AND wposts.ID < '$the_post_id'
       ORDER BY wposts.ID DESC
       LIMIT $post_num";
      
       $result = $wpdb->get_results($sql, OBJECT);
       global $post;
      ?>
      
      <div class="latest_article">
      
      <ul class="latest">
      <h2>Предыдущие статьи из категории: <?php the_category( ', ' ) ?></h2>
      <?php
       foreach ($result as $post) {
      
       setup_postdata($post);
      ?>
       <li>
      <?php the_post_thumbnail(array(40,40)); ?>
      <a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></li>
      <? the_excerpt(); ?>
      
      <?php
       $num++;
       $save_ids[] = $post->ID;
       }
       if ( $num < $post_num || !$result ) {
       $need_more = $post_num-$num;
       $save_ids[] = $the_post_id;
       $save_ids = join (',', $save_ids);
       $more_posts = get_posts("numberposts=$need_more&category=$the_category_id&exclude=$save_ids");
       foreach ($more_posts as $post){
      
       setup_postdata($post);
      ?>
       <li>
      <?php the_post_thumbnail(array(40,40)); ?>
      <a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a>
      
      <? the_excerpt(); ?>
      
      </li>
      <?php
       }
       }
      ?>
      </ul>
      </div>
      <?php } ?>
      
      <?php
       $the_cat = get_the_category();
       $the_cat_id = $the_cat[0]->cat_ID;
       show_previous_posts_from_category($post->ID, $the_cat_id, 5);
       wp_reset_query();
      ?>
      
  14. 29
    Василий

    Мне кажется вы не правы и буду рад, если вы докажете мне обратное. Я также написал Каме, интересно и его мнение.

    Известно, что вес по ссылкам начинает полноценно передаваться лишь через несколько месяцев после простановки. Это было сделано для борьбы с продажными ссылками аля Sape, которые выставляются на несколько дней, а потом удаляются.

    Итак, вы говорите о том, что допустим когда зайходим на 3-ю статью будут показаны ссылки на: 2,1,10,9 статьи. Соответственно, на 1-ой статье будут показаны 10,9,8,7 статьи. Для необновляющегося сайта это великолепное кольцо.

    Но! Допустим, прошло пару месяцев и у вас появилось 5 новых статей. Теперь первая статья ссылается на 15,14,13,12 статьи. Получается, что все ссылки поменялись и теперь вес передается им. Поисковики-то еще не успели учесть те ссылки, а тут уже новые… Таким образом, кольцо разывается и формируется новое, для полноценной работы которого нужно несколько месяцев.

    Но у вашего кольца соответственно нет нескольких месяцев — схема не работает. Где я не прав?

    • 30

      Это актуально только для первых 5 статей (конечно, если выводится 5 предыдущих). Для всех остальных статей список всегда будет постоянным.

      Учитывая, что на сайте, как правило, значительно больше, чем 5 статей, данную проблему считаю не существенной.

      • 31
        Василий

        Но ведь теряется смысл кольца, при котором вес перетекает по кругу! Понятно, что статья 10 фиксировано ссылается на статью 9,8,7,6, но то же самое делает и модуль «Предыдущие статьи». А статья 10, а потом 15 не получает веса 1-ой статьи и потому не передает этот вес дальше по кругу.

        И соответственно при 15 статьях 10-ая,9,8,7,6 и т.п. варятся в собственном соку, абсолютно ТОЧНО ТАК ЖЕ как при модуле «Предыдущие статьи». И потому, мне кажется, смысла в кольце, описанном в данной вашей статье нет!

        Ну или я не прав и данная схема чем-то лучше «Предыдущих статей»?

        P.S. Учитывая, что если поставить 5 статей, то ссылка на одну и ту же статью будет в 5 других, в одном месте и с одинаковым анкором — поисковик тупо может посчитать его за сквозняк и понизить вес, передаваемый по таким ссылкам.

        P.P.S. Учитывая, что все ссылки идут с одинаковым анкором, еще и совпадающим с названием, ну вы понимаете как к такой «ссылочной массе» отнесутся поисковики… :)

  15. 32
    Простой

    Такой вопрос:
    А стоит ли в конце поста выводить рандомно записи (их title) на другие посты?

  16. 33
    Слава

    Помогите сделать как у вас на сайте блок как на скрине http://savepic.su/3272806.jpg

  17. 34
    Евгений

    Что-то не работает на wp 3.8 или я что-то делаю не так?(

  18. 36

    Всем привет, в общем бился 2 дня над текущим кодом… подключал с миниатюрами. Все дело в том, что не смог победить кое-какие стили. То есть если блок перелинковки отображался корректно и красиво, то где-нить в другом месте стили отваливались… Решил с помощью добавления таблицы может и старомодно, но работает _http://ladymsk.com/xulaxup-dlya-poxudeniya.html
    У кого если существует такая проблемка, то вот код:

    
    <table width="600" border="1" align="center" 
     cellpadding="4" cellspacing="0">
     <tr> 
     <td rowspan="2" bgcolor="#FFFFFF" width="100px" style="vertical-align: top"><a href="<?php the_permalink() ?>"><?php the_post_thumbnail('post-thumb'); ?></a> </td>
     <td>
    <h2><a href="<?php the_permalink() ?> rel="bookmark"><?php the_title(); ?></a></h2></td>
     </tr>
     <tr> 
     <td><p><?php echo wp_trim_words( get_the_content(), 14 ); ?></p></td>
     </tr>
     </table>
    
  19. 37
    Дмитрий

    Подскажите пожалуйста как подключить транзитное кеширование к функции вывода предыдущих постов из категории?
    Появилась проблема с нагрузкой на одном блоге, в одной категории несколько тысяч постов.

    • 38
      Дмитрий

      Решил проблему исключением из запроса индексов для таблицы wp_posts
      заменил строку:
      FROM $wpdb->posts wposts
      на
      FROM $wpdb->posts wposts IGNORE INDEX (PRIMARY,type_status_id_date)
      костыль конечно, но помог, снизил время выполнения запроса с 5 секунд до 0.5
      актуально для сайтов с большим количеством постов, у моего в проблемной рубрике уже более 70000 постов, отсюда такая нагрузка.

  20. 39
    Андрей

    Подскажите, как выводить по такому же принципу посты из указанной таксономии, а в случаи если пост не состоит в таксономии, тогда выводились предыдущие посты из категории.

  1. 1
    Дмитрий

    Решил проблему исключением из запроса индексов для таблицы wp_posts
    заменил строку:
    FROM $wpdb->posts wposts
    на
    FROM $wpdb->posts wposts IGNORE INDEX (PRIMARY,type_status_id_date)
    костыль конечно, но помог, снизил время выполнения запроса с 5 секунд до 0.5
    актуально для сайтов с большим количеством постов, у моего в проблемной рубрике уже более 70000 постов, отсюда такая нагрузка.

Ваш комментарий