08.11.2025

Хуки WordPress для изменения URL и просмотра запланированных записей гостями

Несколько полезных  хуков добавляемых в functions.php.

Иного необходимо организовать просмотр запланированных записей гостями и изменение URL записи для запланированных.

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

 

Это код чисто для записей (рубрики пустые)




// post, page post type
add_filter( 'post_link', 'future_permalink', 10, 3 );
// custom post types
add_filter( 'post_type_link', 'future_permalink', 10, 4 );

function future_permalink( $permalink, $post, $leavename, $sample = false ) {
    /* for filter recursion (infinite loop) */
    static $recursing = false;

    if ( empty( $post->ID ) ) {
        return $permalink;
    }

    if ( !$recursing ) {
        if ( isset( $post->post_status ) && ( 'future' === $post->post_status ) ) {
            // set the post status to publish to get the 'publish' permalink
            $post->post_status = 'publish';
            $recursing = true;
            return get_permalink( $post, $leavename ) ;
        }
    }

    $recursing = false;
    return $permalink;
}

/**
 * Разрешает гостям просматривать запланированные записи
 */
function allow_future_posts_to_guests($query) {
    if (!is_admin() && $query->is_main_query() && $query->is_singular()) {
        // Разрешаем доступ к записи, даже если она запланирована
        $query->set('post_status', array('publish', 'future'));
    }
}
add_action('pre_get_posts', 'allow_future_posts_to_guests');

 

 


Этот код более усовершенствованный (в рубриках, архивах, все выводит)

<?php
/**
 * Хук 1: Изменяет постоянную ссылку для запланированных записей
 * Позволяет формировать корректный URL даже для постов со статусом 'future'
 */
add_filter('post_link', 'future_permalink', 10, 3);
add_filter('post_type_link', 'future_permalink', 10, 4);

function future_permalink($permalink, $post, $leavename, $sample = false) {
    static $recursing = false;

    if (empty($post->ID)) {
        return $permalink;
    }

    if (!$recursing) {
        if (isset($post->post_status) && 'future' === $post->post_status) {
            $post->post_status = 'publish';
            $recursing = true;
            return get_permalink($post, $leavename);
        }
    }

    $recursing = false;
    return $permalink;
}

/**
 * Хук 2: Разрешает гостям просматривать запланированные записи
 * Работает для одиночных записей, архивов, категорий, главной страницы и поиска
 */
function allow_future_posts_to_guests($query) {
    // Не вмешиваемся в админку и вторичные запросы
    if (is_admin() || !$query->is_main_query()) {
        return;
    }

    // Проверяем типы страниц, где нужно показать future-записи
    $is_target_page = $query->is_singular() 
                   || $query->is_archive() 
                   || $query->is_home() 
                   || $query->is_search() 
                   || $query->is_tax();

    if ($is_target_page) {
        // Опционально: ограничить только нужным типом записи или категорией
        // if ($query->get('post_type') === 'event' || is_category('events')) {
            $query->set('post_status', array('publish', 'future'));
        // }

        // Опционально: сортировка — будущие записи сверху
        // $query->set('orderby', 'date');
        // $query->set('order', 'DESC');
    }
}
add_action('pre_get_posts', 'allow_future_posts_to_guests');

guest
Другие сообщения форума
Закрыть меню