работает ли функция home() и функция single() не так, как ожидалось, с пользовательскими типами записей?
( Примечание модераторов: Первоначально было озаглавлено: "Проблема с пользовательским типом записи?")
У меня возникли некоторые проблемы с пользовательскими типами сообщений, где все отлично работает, за исключением боковых панелей.
Вот некоторый код из моего sidebar.php
:
<?php
if (is_home()) {
dynamic_sidebar('frontpage-sidebar');
}
if (is_single()) {
dynamic_sidebar('single-post-sidebar');
}
....
?>
Обычно это работает нормально, за исключением случаев, когда я открываю одну страницу, чтобы проверить, что сообщение 'frontpage-sidebar'
не загружается, так как вместо этого загружается 'single-post-sidebar'
. В чем проблема?
Вот код для моего пользовательского тип сообщения:
$labels = array(
'name' => _x('Tools', 'post type general name'),
'singular_name' => _x('Tool', 'post type singular name'),
'add_new' => _x('Add New', 'Tool'),
'add_new_item' => __('Add New Tool'),
'edit_item' => __('Edit Tool'),
'new_item' => __('New Tool'),
'view_item' => __('View Tool'),
'search_items' => __('Search Tools'),
'not_found' => __('No Tools found'),
'not_found_in_trash' => __('No Tools found in Trash'),
'parent_item_colon' => ''
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
'rewrite' => true,
'capability_type' => 'post',
'hierarchical' => false,
'menu_position' => 2,
'supports' => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments','page-attributes') // 'not sure that post can have page-attributes ????'
);
register_post_type('tools', $args);
Как загружать разные боковые панели на разные страницы при использовании пользовательских типов записей вместо обычных записей?
Спасибо.
2 answers
Если я правильно понял ваш вопрос, то вы спрашиваете, почему is_home()
является false
, когда вы просматриваете URL /tools/example-tool/
? Если я правильно понимаю ваш вопрос, ответ прост: is_home() не true
для пользовательских типов сообщений.
На самом деле is_home()
никогда не должно быть true
, за исключением 1.) когда в списке сообщений на домашней странице или 2.) когда "статическая страница" была настроена как "Страница сообщений" в разделе Настройки > Чтение администратора (На моем экране снимок моей "Страницы сообщений" был установлен на "Страницу" - post_type=='page'
- название которой "Главная"):
( источник: mikeschinkel.com)
Поэтому, если вы хотите, чтобы боковая панель отображалась, я думаю, вам нужно будет использовать другие критерии, чем is_home()
. Можете ли вы описать словами, что вы пытались сделать с этим кодом?
ОБНОВЛЕНИЕ
Основываясь на приведенных ниже комментариях и последующие исследования после лучшего понимания проблема похоже, что соответствующие значения для is_home()
и is_single()
никогда не были определены для пользовательских типов сообщений . Таким образом, одним из лучших решений проблемы является создание страницы шаблона темы для конкретного типа сообщения, т.Е. single-tools.php
, если тип сообщения tools
, и определение боковых панелей специально для этого типа сообщения. Но если вы должны направлять все через один single.php
тогда вот некоторые функции, которые вы могли бы использовать вместо is_home()
и is_single()
для достижения ожидаемых результатов, и вы можете сохраните их в файле functions.php
вашей темы (или в одном из файлов плагина):
function is_only_home() {
$post_type = get_query_var('post_type');
return is_home() && empty($post_type);
}
function is_any_single() {
$post_type = get_query_var('post_type');
return is_single() || !empty($post_type);
}
Если взять ваш первый пример кода выше и применить эти функции, то это будет выглядеть так:
<?php
if (is_only_home()) {
dynamic_sidebar('frontpage-sidebar');
}
if (is_any_single()) {
dynamic_sidebar('single-post-sidebar');
}
....
?>
Функция, которую вы хотите использовать:
is_singular($post_types)
где $post_types
- строка/массив пользовательских типов записей. Функция возвращает значение true, если отображается отдельная страница.