WordPress как на ладони

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

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

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

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

Реализация

  1. Вставьте следующий код в файл шаблона functions.php:

    add_action( 'init', 'random_rewrite_rule' );
    add_action( 'template_redirect', 'template_redirect_to_random' );
    
    /*
     * Перенаправление на случайную запись (post)
     */
    function random_rewrite_rule() {
    	$GLOBALS['wp']->add_query_var('random');
    	add_rewrite_rule('random/?$', 'index.php?random=random', 'top');
    }
    
    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;
    }
    
  2. Зайдите в админ-панель: Настройки > постоянные ссылки и просто нажмите кнопку "Сохранить изменения". Нужно это для того, чтобы правила перезаписи УРЛ пересохранились и добавилось наше новое правило.

  3. Вставьте ссылку http://example.com/random куда-нибудь в шаблон. Или используйте такой код:

    <a href="<?php echo home_url() . '/random'; ?>">Случайная запись</a>

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

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

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

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

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

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

/random
/index.php?random=random

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

10 комментариев
    Войти