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

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

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

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

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

  2. 2

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

  3. 3
    i-vbloge

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

  4. 4
    Сеошник

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

  5. 5
    i-vbloge

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

  6. 6

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

    Спасибо!

  7. 7

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

  8. 8
    bethovin

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

  9. 9
    4ikolduhin

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

  10. 11
    4ikolduhin

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

  11. 12
    OZ

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

    • 13

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

      <?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. 16
    OZ

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

    • 17
      Кama

      Привет 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>
      

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

  13. 19
    Кama

    Вахаха, я функцию обозвал, так же как и в ВП в файле 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>
    
    • 20
      Ольга

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

  14. 21
    OZ

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

    • 22
      Кama

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

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

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

  15. 23
    OZ

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

  16. 25
    Загадочный

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

  17. 26

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

  18. 27

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

  19. 28

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

  20. 30

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

  1. 1
    Дмитрий

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

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