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

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

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

Комментарии (158)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • На

      
      <?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();
      ?>
      
      
    • Окончательный вариант )))

      <?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. Мне кажется вы не правы и буду рад, если вы докажете мне обратное. Я также написал Каме, интересно и его мнение.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  18. Всем привет, в общем бился 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. Подскажите пожалуйста как подключить транзитное кеширование к функции вывода предыдущих постов из категории?
    Появилась проблема с нагрузкой на одном блоге, в одной категории несколько тысяч постов.

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

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

    • Хотя, подскажите, как вывести посты из указанной таксономии, а остальное я попробую сделать сам,

      <?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();
      ?>

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