iNickolay
@iNickolay

Почему теряются «красивые ссылки» для запланированных записей?

Получаю нужные записи запросом
get_posts([
    'numberposts' => 12,
    'post_type'   => 'courses',
    'post_status' => 'publish, future',
    'orderby'     => 'date',
    'order'       => 'ASC',
]);

Для вывода ссылки использую функцию the_permalink().
Если указать дату записи в "прошлом" - то она выводится как http://wordpress.test/courses/призма-как-галактика.
А если указать будущее - то http://wordpress.test/?post_type=courses&p=102, но если "вручную" ввести в адресной строке браузера http://wordpress.test/courses/призма-как-галактика - то страница открывается корректно.

Версия WordPress'a последняя, - 4.9.4.
В настройках постоянных ссылок указано "Название записи" (http://wordpress.test/sample-post/)
Файл .htaccess отсутствует.
Плагинов не стоит, из модификаций добавлены свои типы записей и таксономии:
Код в functions.php
if (!function_exists('courses_cp')) {
    function courses_cp() {
        $labels = array(
            'name'                => _x( 'Курсы', 'Post Type General Name', 'courses' ),
            'singular_name'       => _x( 'Курсы', 'Post Type Singular Name', 'courses' ),
            'menu_name'           => __( 'Курсы', 'courses' ),
            'parent_item_colon'   => __( 'Родительский:', 'courses' ),
            'all_items'           => __( 'Все курсы', 'courses' ),
            'view_item'           => __( 'Просмотреть', 'courses' ),
            'add_new_item'        => __( 'Добавить новую запись в Курсы', 'courses' ),
            'add_new'             => __( 'Добавить', 'courses' ),
            'edit_item'           => __( 'Редактировать запись', 'courses' ),
            'update_item'         => __( 'Обновить запись', 'courses' ),
            'search_items'        => __( 'Найти запись', 'courses' ),
            'not_found'           => __( 'Не найдено', 'courses' ),
            'not_found_in_trash'  => __( 'Не найдено в корзине', 'courses' ),
        );
        $args = array(
            'labels'              => $labels,
            'supports'            => array( 'title', 'editor', 'excerpt', ),
            'taxonomies'          => array( 'courses_tax' ),
            'public'              => true,
            'menu_position'       => 5,
            'menu_icon'           => 'dashicons-book-alt',
        );
        register_post_type('courses', $args);
    }

    add_action('init', 'courses_cp', 0);
}
if (!function_exists('courses_tax')) {
    function courses_tax() {
        $labels = array(
            'name'                       => _x( 'Категории Курсов', 'Taxonomy General Name', 'courses'),
            'singular_name'              => _x( 'Категория Курса', 'Taxonomy Singular Name', 'courses'),
            'menu_name'                  => __( 'Категории', 'courses' ),
            'all_items'                  => __( 'Категории', 'courses' ),
            'parent_item'                => __( 'Родительская категория Курса', 'courses' ),
            'parent_item_colon'          => __( 'Родительская категория Курса:', 'courses' ),
            'new_item_name'              => __( 'Новая категория', 'courses' ),
            'add_new_item'               => __( 'Добавить новую категорию', 'courses' ),
            'edit_item'                  => __( 'Редактировать категорию', 'courses' ),
            'update_item'                => __( 'Обновить категорию', 'courses' ),
            'search_items'               => __( 'Найти', 'courses' ),
            'add_or_remove_items'        => __( 'Добавить или удалить категорию', 'courses' ),
            'choose_from_most_used'      => __( 'Поиск среди популярных', 'courses' ),
            'not_found'                  => __( 'Не найдено', 'courses' ),
        );
        $args = array(
            'labels'                     => $labels,
            'hierarchical'               => true,
            'public'                     => true,
        );
        register_taxonomy('courses_tax', array('courses'), $args);
    }
    add_action('init', 'courses_tax', 0);
}

  • Вопрос задан
  • 46 просмотров
Решения вопроса 1
HeadOnFire
@HeadOnFire
WordPress Evangelist
Николай, Никак. И это не странное решение, так и должно быть. Подозреваю, вы не совсем правильно используете эту функцию. Future date, он же scheduled post, это еще неопубликованная запись, а значит у нее еще нет URL, и она недоступна пользователям, не отображается на сайте. То есть, по умолчанию не должна отображаться на сайте, не для этого она сделана. Она будет опубликована при наступлении нужной даты, вот тогда у нее и публичный URL появится. В вашем случае вы пытаетесь "перехитрить систему", принудительно запрашивая еще не опубликованные записи.

Рискну предположить, что вы хотите сделать какое-то подобие анонсов будущих материалов, например такое бывает с ивентами. В этом случае задача решается другим путем – создаете для записей custom field с необходимой датой, и оперируете значениями этого поля. С помощью подзапроса WP_Meta_Query получаете "старые записи" у которых мета-поле <= текущей даты, и "будущие записи", у которых значение >= текущей даты. Везде где дата у вас (по умолчанию – дата публикации) меняете ее на данные из мета-поля. В этом случае все записи – и старые, и "будущие" будут иметь статус publish, публичный URL и все такое. Но выводить вы их можете так, как вашей душе заблагорассудится.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
OtshelnikFm
@OtshelnikFm
Мои работы: otshelnik-fm.ru
Запись еще не опубликована. Поэтому так и выводит. Так же работает если вы посмотрите новую неопубликованную запись в предпросмотре.

Смотрим исходник https://wp-kama.ru/function/get_post_permalink и все становится понятно:
$draft_or_pending = get_post_status( $post ) && in_array( get_post_status( $post ), array( 'draft', 'pending', 'auto-draft', 'future' ) );
- ну и ниже по коду. Для этих состояний ссылки будут типа ugly ("грязные", не ЧПУ)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы