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

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

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

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

  1. Прошу прощения… вопрос решен… забыл венести comments_template() за пределы цикла. Все работает, всем спасибо ;-)

  2. Спасибо за способ Дмитрий, я тоже применил его на блоге.

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

  4. Слушай, а ведь действительно идея. Лишние 4 внутренние ссылки думаю не помешают))

  5. Действительно, данная фиша отлична себя показывает, яша есть все мои страницы, хотя до этого нужно было долго ждать!

  6. У меня в WordPress 2.9.1 заработали оба варианта ..
    В пхп не силен, ну раз уж сказали мол второй правильней, оставил второй.

    Спасибо!

  7. Круто, всё пашет, самый первый вариант на wordpress-2.9.1-ru_RU

  8. Ураа)))искал долга спасиба блогу и тому кто его видёт)))

  9. Не первый раз встречаю коды для перелинковки. Вещь отличная. ПР по моему тоже от этого растёт. Я ошибаюсь или нет?

  10. А кто знает как автоматом перелинковать все статьи с главной страницей? В заголовке сайта ссылка на главную учитывается или нет? Мож я конечно туплю, но чот не доходит.

  11. Здравствуйте, Dimox!
    В посте вы написали что по аналогии можно перелинковать весь блог а не только категории, Вы не могли бы подсказать код? Сам никак не могу зделать(( да и в нете не могу найти.

    • Код будет следующим:

      
      <?php
      function show_previous_posts_from_category ($the_post_id, $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 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;
      ?>
      <ul>
      <?php
        foreach ($result as $post) {
          setup_postdata($post);
      ?>
        <li><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></li>
      <?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&exclude=$save_ids");
          foreach ($more_posts as $post){
            setup_postdata($post);
      ?>
        <li><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></li>
      <?php
          }
        }
      ?>
      </ul>
      <?php } ?>
      
      <?php
        show_previous_posts_from_category($post->ID, 5);
        wp_reset_query();
      ?>
      

      Вставлять его нужно в шаблон для поста.

  12. кто то может привести правильный код????

    • Привет Dimox!
      На просьбу комментатора OZ о правильном коде, для кольцевой перелинковки просто записей (не записей из текущей категории), написал функцию.

      
      <?php
      function previous_posts ($post_num) {
        global $wpdb, $post;
        
        $the_post_id = $post->ID;
        
        $sql = "SELECT ID, post_title
        FROM $wpdb->posts p
        WHERE p.post_status = 'publish'
        AND p.post_type = 'post'
        AND p.ID < {$the_post_id}
        ORDER BY ID DESC
        LIMIT $post_num";
      
        $result = $wpdb->get_results($sql);
      
        $urls='';
        foreach ($result as $post) { ++$num;
      	$save_ids[] = $post->ID;
      	$urls .= '<li><a href="'. get_permalink($post->ID) .'" rel="bookmark">'. $post->post_title .'</a></li>';
        }
        
        if ( $num < $post_num || !$result ) {
          $need_more = $post_num-$num;
          $save_ids = join (',', $save_ids);
          
      	$sql2 = "SELECT ID, post_title
      	FROM $wpdb->posts p
      	WHERE p.post_status = 'publish'
      	AND p.post_type = 'post'
      	AND p.ID NOT IN ({$save_ids},{$the_post_id}) 
      	ORDER BY ID DESC
      	LIMIT $need_more";
      
      	$result2 = $wpdb->get_results($sql2);
      	
          foreach ($result2 as $post) 
      	$urls .= '<li><a href="'. get_permalink($post->ID) .'" rel="bookmark">'. $post->post_title .'</a></li>';
        }
        echo $urls;
        wp_reset_query();
      } 
      ?>
      

      Чтобы код не мешал просматривать/редактировать файлы шаблона его можно вставить в файл functions.php вашего шаблона или в самый низ single.php

      В то место где необходимо вывести ссылки на предыдущие статьи вставляем это:

      
      <ul>
         <?php previous_posts(5); //5 это количество ссылок, которые будут выводится ?>
      <ul>
      

      Следуует отметить, что он работает быстрее, так как нет необходимости выбирать записи из определенной категории и соответственно отпадает необходимость объединять таблицы базы данных, т.е. этот код работает всего с одной таблицей.

      • Вставляю в шаблон страницы:

        Fatal error: Cannot redeclare previous_posts() (previously declared in /sata1/home/users/kinozoom/www/www.kinozoom.com.ua/wp-includes/link-template.php:1450) in /sata1/home/users/kinozoom/www/www.kinozoom.com.ua/wp-content/themes/basicpress/single.php on line 47

  13. Вахаха, я функцию обозвал, так же как и в ВП в файле link-template.php. Получилось 2 функции с одинаковыми названиями, а так в PHP дела не делаются… :).
    К тому же, были некоторые недочеты: в прошлом варианте не выводились записи для самой первой записи (забыл проверить) и еще я

    <ul>

    тег не закрыл :).
    Пардон, я чуть под пывом был :)

    Вот «правильный» вариант:

    
    <?php 
    function posts_before ($post_num) {
      global $wpdb, $post;
      
      $the_post_id = $post->ID;
      
      $sql = "SELECT ID, post_title
      FROM $wpdb->posts p
      WHERE p.post_status = 'publish'
      AND p.post_type = 'post'
      AND p.ID < {$the_post_id}
      ORDER BY ID DESC
      LIMIT $post_num";
    
      $result = $wpdb->get_results($sql);
    
      $urls='';
      foreach ($result as $post) { ++$num;
      $save_ids[] = $post->ID;
      $urls .= '<li><a href="'. get_permalink($post->ID) .'" rel="bookmark">'. $post->post_title .'</a></li>';
      }
      
      if ( $num < $post_num || !$result ) {
        $need_more = $post_num-$num;
        if ($save_ids) $save_ids = join (',', $save_ids).',';
        
      $sql2 = "SELECT ID, post_title
      FROM $wpdb->posts p
      WHERE p.post_status = 'publish'
      AND p.post_type = 'post'
      AND p.ID NOT IN ({$save_ids}{$the_post_id}) 
      ORDER BY ID DESC
      LIMIT $need_more";
    
      $result2 = $wpdb->get_results($sql2);
      
        foreach ($result2 as $post) 
      $urls .= $post->ID . '<li><a href="'. get_permalink($post->ID) .'" rel="bookmark">'. $post->post_title .'</a></li>';
      }
      echo $urls;
      wp_reset_query();
    } 
    ?>
    

    Где надо вывести ссылки вставляем:

    
    <ul>
    <?php posts_before (5); //5 это количество ссылок, которые будут выводится ?>
    </ul>
    
    • Уважаемый Kama! У меня в теме revolution-church single.php нет совсем, а пробуя вставить Вами код в functions.php вынуждена пользоваться «методом тыка» (ибо «блондинка», а сайтом заниматься все равно надо). Прошу о помощи — подскажите между какими строками следует вставить вышеприведенный фрагмент в файле http://narod.ru/disk/3124509001/functions.php.html ?
      Спасибо!

  14. красота!
    примного благодарен!
    единственный ньюанс:
    если выбираем последний пост, то дополнительно получаем вывод ID постов:
    скрин
    если выбираем предпоследний пост, то два из трех будут с ID

    • Это я когда тестил, поставил вывод ИД, чтобы отличать дополнительные посты от предыдущих и забыл удалитить лишний код. Тут (строка 38):

      $urls .= $post->ID . '<li><a href="'. get_permalink($post->ID) .'" rel="bookmark">'. $post->post_title .'</a></li>';

      Удалите $post->ID .

  15. Cool!
    Как же видно хорошо знать хорошо PHP )))

  16. Класс. Только у Вас это нашел, больше нигде не нашел такой информации :-) Причем не хотелось плагинов, а вручную сделать. Всё заработало на последней версией Вордпресса. Я очень доволен! Спасибо.

  17. Мне тоже помог этот скрипт, главное всё по уму и просто. Спасибо

  18. Скрипт хорош, но вот возвращаясь к вопросу внутренней перелинковки — как насчет перелинковки за счет вывода случайных картинок?
    Я реализовал это у себя на блоге за счет плагина NextGen и вывел на сайд бар с помощью виджета. Единственное НО — это при клике на этой случайной картинке осуществлялся переход на статью ее содержащую.
    Похоже что тут должна быть вначале привязка у альбома\картинки к статье в которую она вставляется. И дальше уже какая то функция привязывающая случайную картинку к этой уникальной привязке. В этом и загвоздка .. )

  19. Подскажите, а возможно вывести в категориях предыдущие или похожие записи, а не только в одиночной. Как например это сделано на filmopoisk.ru

  20. Привет. Спасибо за код перелинковки по категориям. В 67 комментарии он не исправлен, пришлось «склеивать» по комментариям, зато потренировался… :)
    На счет общей перилинковки, отображаются только следующие статьи, так задумано? Почему не отображаются предыдущие статьи? или так не стоит делать, чтобы перелинковка была круговая? Или этот момент просто упустил Уважаемый Kama?

    • Отображаться должны предыдущие и по кругу.

      А вообще рекомендую вот эти статьи:

      http://wp-kama.ru/id_69/perelinkovka-statey-v-wordpress-predyiduschie-zapisi-iz-kategorii.html
      http://wp-kama.ru/id_50/perelinkovka-statey-predyiduschie-zapisi.html

      Так представлены наилучшие варианты.

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