WordPress как на ладони
Мощный и не дорогой хостинг от Fornex.com

Перенаправление на случайную запись в WordPress

В этой заметке я покажу, как перенаправлять пользователей на случайную запись в WordPress.

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

Такая навигация будет работать так: вставляете в шаблон ссылку, кликнув на которую пользователя перекинет на случайную запись.

Реализация

  1. Вставьте следующий код в файл шаблона functions.php:
/* 
 * Перенаправление на случайную запись (post)
 */
function random_rewrite_rule() {
	$GLOBALS['wp']->add_query_var('random');
	add_rewrite_rule('random/?$', 'index.php?random=random', 'top');
}
add_action('init', 'random_rewrite_rule');

function template_redirect_to_random() {
	if( get_query_var('random') != 'random' )
		return;

	$random_post = get_posts('orderby=rand&numberposts=1');
	$random_post = array_shift( $random_post );
	$link = get_permalink( $random_post );

	wp_redirect( $link, 307 );

	exit;
}
add_action('template_redirect', 'template_redirect_to_random');
  1. Зайдите в админ-панель: Настройки > постоянные ссылки и просто нажмите кнопку "Сохранить изменения". Нужно это для того, чтобы правила перезаписи УРЛ пересохранились и добавилось наше новое правило.

  2. Вставьте ссылку http://site.ru/random куда-нибудь в шаблон. Или используйте такой код:
<a href="<?php echo home_url() . '/random'; ?>">Случайная запись</a>

Все! Теперь кликнув по ссылке, пользователя перекинет на случайный пост.

Заметки для кода

Код добавляет переменную запроса (add_query_var) для проверки: перенаправлять, если в переменной запроса существует запрос random и он равен random. Эта проверка используется во время события template_redirect.

Во время перенаправления статус 307 (временное перенаправление) используется вместо 302 (перемещено временно), потому что некоторые браузеры кэшируют 302-й статус и рандома в этом случае не получится.

Возможные баги

Для плагинов страничного кэширования возможно нужно будет указать правила исключения: УРЛ которые кэшировать не нужно. Правила будут такие:

/random
/index.php?random=random

На этом все. Буду рад, если кому-то пригодится.

8 комментов
  • @ brigadir cайт: csg.technology

    This is somewhat embarrassing, isn’t it?
    It seems we can’t find what you’re looking for. Perhaps searching can help.

    В общем, возвращает 404.

    Ответить4.3 года назад #
  • @ Татьяна cайт: knipclub.ru

    Извиняюсь за глупый вопрос, а как будет выглядеть это перенаправление на случайный пост? просто ссылка? Можно ли оформить поинтереснее, чтобы привлечь внимание и люди кликали?
    Кстати, очень понравился модуль предварительного просмотра для комментария! smile Поделитесь, как такое сделать?

    Ответить4.3 года назад #
    • Kama7099

      Да просто ссылка будет. Ну, вы можете её оформить в кнопку или вставить анкором картинку и будет больше внимания к ней... dance

      Модуль вручную делался, там не все так просто, рассказать не получится. sorry

      Ответить4.3 года назад #
  • Виталий

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

    Ответить2.5 года назад #
    • Александр

      В строке 'category' укажите ID своей категории

      function random_rewrite_rule() {
        $GLOBALS['wp']->add_query_var('random');
        add_rewrite_rule('random/?$', 'index.php?random=random', 'top');
      }
      add_action('init', 'random_rewrite_rule');
      
      function template_redirect_to_random() {
        if( get_query_var('random') != 'random' )
      	return;
      
      $args = array(
        'numberposts' => 1,
        'category'    => 2,
        'orderby'     => 'rand'
      );
      
        $random_post = get_posts($args);
        $random_post = array_shift( $random_post );
        $link = get_permalink( $random_post );
      
        wp_redirect( $link, 307 );
      
        exit;
      }
      add_action('template_redirect', 'template_redirect_to_random');
      1
      Ответить1.8 года назад #
  • @ Игорь

    Возможно только у меня такая ошибка возникла:
    После добавления кода Яндекс начал выкидывать некоторые страницы сайта из индекса и тут же "закидывать" их обратно, но уже с url site.ru/random/, а не оригинальным.
    "Вылечил" Disallow: /random/ в robots.txt

    1
    Ответить3 мес назад #
Здравствуйте, !     Войти . Зарегистрироваться