Главная Продвижение сайта

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

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

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

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

  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?

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