web-dev-qa-db-fra.com

is_home () et is_single () ne fonctionnent pas comme prévu avec les types de publication personnalisés?

( Note du modérateur: A été initialement intitulé: "Problème de type de message personnalisé?" )

J'ai des problèmes avec les types d'articles personnalisés où tout fonctionne très bien, à l'exception des barres latérales.

Voici du code de mon sidebar.php:

<?php
  if (is_home()) {
    dynamic_sidebar('frontpage-sidebar');
  }
  if (is_single()) {
    dynamic_sidebar('single-post-sidebar');
  }
  ....
?>

Normalement, cela fonctionne bien, sauf que lorsque j'ouvre une seule page pour vérifier que le post 'frontpage-sidebar' ne se charge pas, le 'single-post-sidebar' se charge à la place. Où est le problème?

Voici le code de mon type de message personnalisé:

$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);

Comment charger différentes barres latérales sur différentes pages lorsque j'utilise des types de publication personnalisés au lieu de publications ordinaires?

Merci.

4
user1147

Si je comprends bien votre question, les utilisateurs demandent pourquoi is_home() est false lorsque vous consultez l'URL /tools/example-tool/? Si je comprends votre question, la réponse est simplement que is_home () n'est pas true pour les types de publication personnalisés.

En fait, is_home() ne devrait jamais être true, sauf pour 1.) lorsque la liste des publications de la page d'accueil est affichée, ou 2.) lorsqu'un "page statique" a été défini pour être un "page des publications" dans la section Paramètres> Lecture de l'administrateur (Dans ma capture d'écran, ma "page de messages" a été définie sur une "Page" - post_type=='page' - dont le titre est "Accueil") :

 Setting a Home Page in WordPress 3.0's Admin Console 
(source: mikeschinkel.com )

Donc, si vous voulez que la barre latérale apparaisse, je pense que vous devrez utiliser un critère différent de celui de is_home(). Pouvez-vous décrire en mots ce que vous tentiez d'accomplir avec ce code?

METTRE À JOUR

D'après les commentaires ci-dessous et recherches ultérieures après une meilleure compréhension du problème, il apparaît les valeurs appropriées pour is_home() et is_single() n'ont jamais été réellement définies pour les types de publication personnalisés . Une des meilleures solutions au problème consiste donc à créer une page de modèle de thème spécifique au type de publication, c'est-à-dire single-tools.php si le type de publication est tools, et à définir des barres latérales spécifiquement pour ce type de publication. Mais si vous devez tout diriger via un single.php, voici quelques fonctions que vous pouvez utiliser à la place de is_home() et is_single() pour obtenir les résultats escomptés et que vous pouvez stocker dans le fichier functions.php de votre thème (ou un des fichiers d'un plugin)} _:

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);
}

Prendre votre premier exemple de code ci-dessus et appliquer ces fonctions ressemblerait à ceci:

<?php
  if (is_only_home()) {
    dynamic_sidebar('frontpage-sidebar');
  }
  if (is_any_single()) {
    dynamic_sidebar('single-post-sidebar');
  }
  ....
?>
7
MikeSchinkel

La fonction que vous souhaitez utiliser: is_singular($post_types)$post_types est une chaîne/un tableau de types de publication personnalisés. La fonction retourne vrai si une page singulière est affichée.

4
user10757