работает ли функция 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);

Как загружать разные боковые панели на разные страницы при использовании пользовательских типов записей вместо обычных записей?

Спасибо.

Author: MikeSchinkel, 2010-10-14

2 answers

Если я правильно понял ваш вопрос, то вы спрашиваете, почему is_home() является false, когда вы просматриваете URL /tools/example-tool/? Если я правильно понимаю ваш вопрос, ответ прост: is_home() не true для пользовательских типов сообщений.

На самом деле is_home() никогда не должно быть true, за исключением 1.) когда в списке сообщений на домашней странице или 2.) когда "статическая страница" была настроена как "Страница сообщений" в разделе Настройки > Чтение администратора (На моем экране снимок моей "Страницы сообщений" был установлен на "Страницу" - post_type=='page' - название которой "Главная"):

Setting a Home Page in WordPress 3.0's Admin Console
( источник: 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');
  }
  ....
?>
 7
Author: MikeSchinkel, 2020-06-15 08:21:38

Функция, которую вы хотите использовать: is_singular($post_types) где $post_types - строка/массив пользовательских типов записей. Функция возвращает значение true, если отображается отдельная страница.

 4
Author: user10757, 2012-08-16 11:20:05