Страница архива пользовательского типа публикаций пустая

Вопрос или проблема

Я создал пользовательский тип записи с слагом plist через кастомный плагин, который я сделал.

На моем локальном сервере архив работает, но на живом сервере он возвращает пустую страницу.

Вот код страницы архива ‘include’

/**
 * Добавить шаблон архива прайс-листа
 * @since    1.0.0
*/
add_filter( 'archive_template', 'get_plist_archive_template' ) ;
function get_plist_archive_template( $archive_template ) {
     global $post;

     if ( is_post_type_archive ( 'plist' ) ) {
          $archive_template = dirname( __FILE__ ) . '\partials\archive-plist.php';
     }
     return $archive_template;
}

Ссылка: http://cratetimer.com/plist/

Также это может помочь:

/**
 * Регистрация пользовательского типа записи Прайс-лист
 * @since    1.0.0
*/
if ( ! function_exists('price_item_post_type') ) {
    add_action( 'init', 'price_item_post_type', 0 );
    // Регистрация пользовательского типа записи
    function price_item_post_type() {

        $labels = array(
            'name'                  => _x( 'Прайс-листы', 'Post Type General Name', 'plist' ),
            'singular_name'         => _x( 'Прайс-лист', 'Post Type Singular Name', 'plist' ),
            'menu_name'             => __( 'Прайс-лист', 'plist' ),
            'name_admin_bar'        => __( 'Прайс-лист', 'plist' ),
            'archives'              => __( 'Архивы прайс-листов', 'plist' ),
            'attributes'            => __( 'Атрибуты прайс-листа', 'plist' ),
            'parent_item_colon'     => __( 'Родительский прайс-лист:', 'plist' ),
            'all_items'             => __( 'Все прайс-листы', 'plist' ),
            'add_new_item'          => __( 'Добавить новый прайс-лист', 'plist' ),
            'add_new'               => __( 'Добавить новый', 'plist' ),
            'new_item'              => __( 'Новый прайс-лист', 'plist' ),
            'edit_item'             => __( 'Редактировать прайс-лист', 'plist' ),
            'update_item'           => __( 'Обновить прайс-лист', 'plist' ),
            'view_item'             => __( 'Просмотр прайс-листа', 'plist' ),
            'view_items'            => __( 'Просмотр прайс-листов', 'plist' ),
            'search_items'          => __( 'Поиск прайс-листа', 'plist' ),
            'not_found'             => __( 'Не найдено', 'plist' ),
            'not_found_in_trash'    => __( 'Не найдено в корзине', 'plist' ),
            'featured_image'        => __( 'Изображение', 'plist' ),
            'set_featured_image'    => __( 'Установить изображение', 'plist' ),
            'remove_featured_image' => __( 'Удалить изображение', 'plist' ),
            'use_featured_image'    => __( 'Использовать как изображение', 'plist' ),
            'insert_into_item'      => __( 'Вставить в прайс-лист', 'plist' ),
            'uploaded_to_this_item' => __( 'Загружено в этот прайс-лист', 'plist' ),
            'items_list'            => __( 'Прайс-листы', 'plist' ),
            'items_list_navigation' => __( 'Навигация по прайс-листам', 'plist' ),
            'filter_items_list'     => __( 'Фильтр прайс-листов', 'plist' ),
        );
        $args = array(
            'label'                 => __( 'Прайс-лист', 'plist' ),
            'description'           => __( 'Элемент прайс-листа для рынка', 'plist' ),
            'labels'                => $labels,
            'supports'              => array( ),
            'hierarchical'          => false,
            'public'                => true,
            'show_ui'               => true,
            'show_in_menu'          => true,
            'menu_position'         => 20,
            'menu_icon'             => 'dashicons-tag',
            'show_in_admin_bar'     => true,
            'show_in_nav_menus'     => true,
            'can_export'            => true,
            'has_archive'           => true,        
            'exclude_from_search'   => true,
            'publicly_queryable'    => true,
            'capability_type'       => 'page',
        );
        register_post_type( 'plist', $args );

    }

}

Я пробовал flush_rewrite_rules() и это не сработало.

Вы должны сказать WP, что archive.php должен применяться к вашему пользовательскому типу записи, а также к его другим настройкам по умолчанию. Вы можете использовать фильтр pre_get_posts, чтобы сделать это, обязательно тщательно изучите это перед использованием, так как есть правильный и неправильный способ использования этого фильтра.

Например, попробуйте:

function add_custom_post_type_to_archiving( $query ) {
    $query->set( 'post_type', array(
     'post', 'custom_post_type_name1','custom_post_type_name2'
        ));
    return $query;
}
add_filter( 'pre_get_posts', 'add_custom_post_type_to_archiving' );

Поскольку это работает на вашей локальной машине, а не на сервере, я подозреваю, что это связано с окружением. Это заставляет меня подозревать:

$archive_template = dirname( __FILE__ ) . '\partials\archive-plist.php';

Если вы запускаете это на стандартном LAMP стеке, вероятно, вам следует использовать прямые слэши (/) вместо обратных слэшей (\).

Также существует вероятность, что вызов dirname() возвращает путь с слэшем на конце, что означает, что в пути есть двойной слэш (вероятно, /\).

Я предлагаю попробовать изменить направление ваших слэшей, а затем заменить dirname() на plugin_dir_path(). Вы заметите, что plugin_dir_path() использует функцию с именем trailingslashit(), которая добавляет завершающий слэш, если его еще нет. Это означает, что вы должны удалить первый слэш в вашем пути.

В итоге это будет выглядеть так:

$archive_template = plugin_dir_path( __FILE__ ) . 'partials/archive-plist.php';

Ответ или решение

Проблема с пустой архивной страницей пользовательского типа записей (CPT) plist может возникать по нескольким причинам. Опираясь на предоставленные вами данные, давайте подробно рассмотрим возможные причины и их решения.

1. Проверка пути к шаблону

В коде get_plist_archive_template() у вас используется следующий путь для файла шаблона:

$archive_template = dirname( __FILE__ ) . '\partials\archive-plist.php';

Если ваш сервер работает в среде LAMP (Linux, Apache, MySQL, PHP), то пути с обратными слешами (\) не будут работать, так как это синтаксис Windows. Вместо этого используйте прямые слеши (/). Также лучше применять функцию plugin_dir_path() вместо dirname(__FILE__), так как это обеспечит правильный путь и добавит завершающий слеш, если его нет.

Замените строку на следующую:

$archive_template = plugin_dir_path( __FILE__ ) . 'partials/archive-plist.php';

2. Регистрация пользовательского типа записей

Убедитесь, что ваш CPT правильно зарегистрирован с настройкой has_archive => true. Судя по вашему коду, эта настройка присутствует. Однако также проверьте, чтобы пользовательские записи действительно существовали в вашей базе данных.

Ваше определение CPT выглядит корректно:

$args = array(
    // ...
    'has_archive' => true,
    // ...
);

3. Использование flush_rewrite_rules()

Вы упомянули, что вы пытались использовать flush_rewrite_rules(). Если это не помогло, убедитесь, что вы вызываете эту функцию только один раз после регистрации CPT, например, во время активации вашего плагина:

register_activation_hook( __FILE__, 'flush_rewrite_rules' );

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

4. Использование pre_get_posts

Вы правильно упомянули использование фильтра pre_get_posts для улучшения работы с архивами. Это может быть полезно в случае, если есть другие условия, влияющие на вывод постов:

function add_custom_post_type_to_archiving( $query ) {
    if ( !is_admin() && $query->is_post_type_archive( 'plist' ) ) {
        $query->set( 'post_type', 'plist' );
    }
    return $query;
}
add_filter( 'pre_get_posts', 'add_custom_post_type_to_archiving' );

5. Журналирование ошибок

Поскольку проблема возникает на живом сервере, включите отображение ошибок или проверьте журнал ошибок сервера. Часто причина проблемы может быть связана с неправильными правами доступа к файлам или конфликтами с другими плагинами.

Заключение

Убедитесь, что все изменения внедрены и тестируйте доступ к архиву http://cratetimer.com/plist/. Если после всех изменений проблема сохраняется, проверьте наличие записей типа plist и обратитесь к логам ошибок сервера для более детального анализа.

Оцените материал
Добавить комментарий

Капча загружается...