Type de publication personnalisé, pas besoin de vue unique, plus besoin de réécritures de permalien qui incluent le hachage dans l'URI

8

Nous utilisons les CPT pour gérer une page de questions fréquemment posées sur un site, où la question est le titre du message et la réponse est le contenu du message. Il y a une page principale pour la FAQ qui montre tous les articles (page d'archive FAQ). Avec cette structure, nous n'avons vraiment pas besoin de la vue unique pour toute FAQ et en fait, nous aimerions l'omettre de la structure du site. Pour traiter les permaliens, nous aimerions les définir comme quelque chose comme example.com/faq/#uniqueIdentifier, en pensant que nous utiliserons #uniqueIdentifier pour faire correspondre un div sur la page d'archive contenant la réponse et attirer l'attention sur elle dans certains mode. L'identifiant unique peut être un ID de publication, un titre de question de FAQ, des données d'une méta-boîte ou autre chose.

Permettez-moi donc de récapituler ce dont j'ai besoin, nous devons accomplir:

(1) réécrire les permaliens de faq en / faq / # quelque chose, et

(2) assurez-vous que toutes les routes / faq / links pointent vers le modèle d'archive et non pas une seule

Je suis surtout un noob mais assez bon pour tâtonner mon chemin à travers les choses. Je n'ai jamais tenté de réécrire, donc j'apprécierais une direction particulière à ce sujet.

Je vous remercie.

daxitude
la source

Réponses:

12

Salut @daxitude:

Permettez-moi d'abord de vous suggérer de reconsidérer. Si vous n'avez pas de pages de FAQ individuelles pour chaque FAQ:

  1. Vous réduisez votre surface pour l'optimisation des moteurs de recherche et réduisez le trafic potentiel que vous pourriez obtenir, et

  2. Vous empêchez quelqu'un de partager une FAQ spécifique avec un ami par e-mail et / ou de partager avec son réseau sur Facebook, Twitter, etc. (En tant qu'utilisateur, je suis toujours frustré par les développeurs de sites qui me refusent d'avoir une URL directe à un élément et à la place me forcer à créer un lien vers la page qui répertorie tous les éléments.)

Cependant, si vous voulez toujours le faire, faites deux choses:

1.) Utilisez le 'post_type_link'crochet

Utilisez le 'post_type_link'crochet pour modifier l'URL comme dans l'exemple suivant * (je suppose que votre type de publication personnalisé est 'faq'). Ajoutez ce qui suit au functions.phpfichier de votre thème :

add_action('post_type_link','yoursite_post_type_link',10,2);
function yoursite_post_type_link($link,$post) {
  $post_type = 'faq';
  if ($post->post_type==$post_type) {
    $link = get_post_type_archive_link($post_type) ."#{$post->post_name}";
  }
  return $link;
}

2.) unset($wp_rewrite->extra_permastructs['faq'])

C'est un hack , mais c'est un hack obligatoire pour faire ce que vous voulez. Utilisez un 'init'crochet pour unset($wp_rewrite->extra_permastructs['faq']). Il supprime la règle de réécriture qui register_post_type()ajoute. J'inclus un appel à register_post_type()afin que je puisse fournir un exemple complet pour vous et les autres:

add_action('init','yoursite_init');
function yoursite_init() {
  register_post_type('faq',array(
      'labels' => array(
      'name' => _x('FAQs', 'post type general name'),
      'singular_name' => _x('FAQ', 'post type singular name'),
      'add_new' => _x('Add New', 'faq'),
      'add_new_item' => __('Add New FAQ'),
      'edit_item' => __('Edit FAQ'),
      'new_item' => __('New FAQ'),
      'view_item' => __('View FAQ'),
      'search_items' => __('Search FAQs'),
      'not_found' =>  __('No FAQs found'),
      'not_found_in_trash' => __('No FAQs found in Trash'),
      'parent_item_colon' => '',
      'menu_name' => 'FAQs'
    ),
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'query_var' => true,
    'rewrite' => array('slug'=>'faqs'),
    'capability_type' => 'post',
    'has_archive' => 'faqs',
    'hierarchical' => false,
    'supports' => array('title','editor','author','thumbnail','excerpt')
  ));

  global $wp_rewrite;
  unset($wp_rewrite->extra_permastructs['faq']);  // Removed URL rewrite for specific FAQ 
  $wp_rewrite->flush_rules(); // THIS SHOULD BE DONE IN A PLUGIN ACTIVATION HOOK, NOT HERE!
}

C'est à peu près ça.

Bien sûr, l'utilisation ci-dessus de $wp_rewrite->flush_rules()dans un 'init'hook est vraiment une mauvaise pratique et ne devrait être effectuée qu'une seule fois, j'ai donc implémenté un plugin complet et autonome appelé FAQ_Post_Typepour le faire correctement. Ce plugin ajoute un type de publication FAQ avec les règles d'URL que vous souhaitez et il utilise un register_activation_hook()pour vider les règles de réécriture; l'activation étant évidemment l'une des rares choses qui nécessitent du code de plugin au lieu du code qui peut s'exécuter dans le functions.phpfichier d' un thème .

Voici le code du FAQ_Post_Typeplugin; n'hésitez pas à modifier selon vos besoins:

<?php
/*
Plugin Name: FAQ Post Type
Description: Answers the question "Custom post type, no need for single view, plus want permalink rewrites that include hash in URI" on WordPress Answers.
Plugin URL: http://wordpress.stackexchange.com/questions/12762/custom-post-type-no-need-for-single-view-plus-want-permalink-rewrites-that-incl
*/
if (!class_exists('FAQ_Post_Type')) {
  class FAQ_Post_Type {
    static function on_load() {
      add_action('post_type_link', array(__CLASS__,'post_type_link'),10,2);
      add_action('init', array(__CLASS__,'init'));
    }
    static function post_type_link($link,$post) {
      if ('faq'==$post->post_type) {
        $link = get_post_type_archive_link('faq') ."#{$post->post_name}";
      }
      return $link;
    }
    static function init() {
      register_post_type('faq',array(
          'labels' => array(
          'name' => _x('FAQs', 'post type general name'),
          'singular_name' => _x('FAQ', 'post type singular name'),
          'add_new' => _x('Add New', 'faq'),
          'add_new_item' => __('Add New FAQ'),
          'edit_item' => __('Edit FAQ'),
          'new_item' => __('New FAQ'),
          'view_item' => __('View FAQ'),
          'search_items' => __('Search FAQs'),
          'not_found' =>  __('No FAQs found'),
          'not_found_in_trash' => __('No FAQs found in Trash'),
          'parent_item_colon' => '',
          'menu_name' => 'FAQs'
        ),
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'query_var' => true,
        'rewrite' => array('slug'=>'faqs'),
        'capability_type' => 'post',
        'has_archive' => 'faqs',
        'hierarchical' => false,
        'supports' => array('title','editor','author','thumbnail','excerpt'),
      ));
      global $wp_rewrite;
      unset($wp_rewrite->extra_permastructs['faq']);  // Remove URL rewrite for specific FAQ
    }
    static function activate() {
      global $wp_rewrite;
      $wp_rewrite->flush_rules();
    }
  }
  FAQ_Post_Type::on_load();
  register_activation_hook(__FILE__,array('FAQ_Post_Type','activate'));
}

Vous pouvez également conserver les règles de vidage à l'intérieur du 'init'en utilisant une vérification pour une valeur d'option si vous préférez ceci:

// Add this code in your 'init' hook at your register_post_type('faq',...)
if (!get_option('faq_rewrite_rules_updated')) {
  global $wp_rewrite;
  unset($wp_rewrite->extra_permastructs['faq']);  // Remove URL rewrite for specific FAQ
  $wp_rewrite->flush_rules();
  update_option('faq_rewrite_rules_updated',true);
}

Votre choix.

Quoi qu'il en soit, faites-moi savoir s'il existe des cas d'utilisation, vous découvrez que cela ne résout pas.

MikeSchinkel
la source
Salut @MikeSchinkel. HOU LA LA! Vous êtes certainement une personne utile. Je suis tout à fait d'accord sur votre reconsidération des points 1 et 2, mais je pense que nous avons principalement répondu à ces préoccupations. Pour # 1 - puisque nous affichons la question complète et la réponse sur la page d'archives cpt, une seule vue pour chaque FAQ ne serait-elle pas un contenu en double et donc pas nécessairement favorable au référencement? En plus de cela, nous avons senti qu'une page entière pour une seule question de la FAQ est un peu agitée et nous préférons livrer le contenu plus rapidement aux gens que d'avoir à cliquer sur plus de liens pour y arriver.
daxitude
(apparemment, il y a des limites de caractères aux commentaires et je suis un individu bavard!) Pour # 2 - tout après le hachage dans l'uri est associé à un div sur la page qui contient la réponse. toutes les autres réponses sont masquées lors du chargement de la page et les diapositives de réponses correspondantes s'ouvrent. De cette manière, nous préservons pleinement la possibilité de partager et d'enregistrer des liens ... tant que nous ne sommes pas inconstants et que nous modifions cette structure pour une raison stupide.
daxitude
Quant à votre réponse, l'étape 1 est fantastique! Je ne connaissais pas auparavant ce crochet et je n'avais pas prévu une solution aussi soignée. Par curiosité, je me rends compte que vous pouvez implémenter l'étape 1 et non l'étape 2. Cela envoie des liens de faq vers l'URI approprié mais préserve également les pages uniques .. et nous ne les lions simplement jamais via le site. Cela semble-t-il une façon raisonnable de procéder? Je vous remercie.
daxitude
@daxitude - Il vaut mieux interdire l'indexation des moteurs de recherche sur une page d'archive et leur permettre d'indexer les pages individuelles. Les deux éléments les plus importants pour le référencement sont la page <title>et <h1>Heading</h1>vous n'en obtiendrez qu'un seul sur une page d'archive, mais vous en avez un chacun pour les pages de FAQ individuelles. Je suis d'accord que tout le contenu de la FAQ est le meilleur sur la page d'archive, mais vous pouvez fournir tout le contenu sur la page principale et une page d' exploration pour ceux qui le souhaitent (qui inclut les moteurs de recherche) , et cela ne fait certainement rien de mal; ajoutez simplement un "Permalien" près de la question FAQ.
MikeSchinkel
@daxitude - Pourquoi pensez-vous que je n'ai pas implémenté # 2? C'est le but du code qui suit l'en-tête "2.) unset($wp_rewrite->extra_permastructs['faq'])" que, bien sûr, je soutiens que vous n'utilisez pas. :)
MikeSchinkel