Вопрос или проблема
Я создал пользовательский тип записи с слагом 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
и обратитесь к логам ошибок сервера для более детального анализа.