web-dev-qa-db-fra.com

Type de message personnalisé, pas besoin de vue unique, plus réécritures permanentes de liens qui incluent un hachage dans l'URI

Nous utilisons les CPT pour gérer une page de questions fréquemment posées sur un site, où la question est le titre de l'article et la réponse, son contenu. Il existe une page principale pour la FAQ qui affiche tous les messages (page d’archive de la FAQ). Avec cette structure, nous n'avons vraiment pas besoin de la vue unique pour aucune FAQ et nous aimerions en fait la supprimer de la structure du site. Pour traiter les liens permanents, nous aimerions les définir comme suit, par exemple, example.com/faq/#uniqueIdentifier, en pensant que nous utiliserons le #uniqueIdentifier pour faire correspondre un div sur la page d'archive contenant la réponse et attirer notre attention dans certains cas. mode. Le uniqueIdentifier peut être post ID, le titre de la question, les données d'une méta-boîte ou autre chose.

Alors laissez-moi récapituler ce dont j'ai besoin, nous devons accomplir:

(1) réécrire les permaliens des faq pour qu'ils soient/faq/# quelque chose, et

(2) assurez-vous que tous les chemins/faq/links routent vers le modèle d’archive et non pas un seul

Je suis surtout un noob mais je suis plutôt bon pour me débrouiller dans les choses. Je n'ai jamais tenté de réécrire, donc j'apprécierais une orientation particulière à ce sujet.

Je vous remercie.

8
daxitude

Salut @daxitude:

Laissez-moi d'abord vous suggérer de reconsidérer. Si vous ne disposez pas de FAQ pages 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 un spécifique FAQ avec un ami par courrier électronique et/ou de le partager avec son réseau sur Facebook, Twitter, etc. (En tant qu'utilisateur I suis toujours frustré par les développeurs de sites qui ne me permettent pas d’avoir une URL directe vers un élément et me forcent plutôt à créer un lien vers la page répertoriant tous les éléments.)} _

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

1.) Utilisez le crochet 'post_type_link'

Utilisez le crochet 'post_type_link' pour modifier l'URL comme dans l'exemple suivant * (je suppose que votre type d'article personnalisé est 'faq'). Ajoutez les éléments suivants au fichier functions.php 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 bidouille, mais c'est un bidouillage obligatoire pour faire ce que vous voulez. Utilisez un hook 'init' avec unset($wp_rewrite->extra_permastructs['faq']). Il supprime la règle de réécriture que register_post_type() ajoute. J'inclus un appel à register_post_type() pour vous fournir un exemple complet, à la fois pour vous et pour 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 hook 'init' est vraiment 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_Type pour le faire correctement. . Ce plugin ajoute un type de publication FAQ avec les règles d'URL souhaitées et utilise une register_activation_hook() pour vider les règles de réécriture. l'activation est évidemment l'une des rares choses nécessitant du code de plugin au lieu d'un code pouvant être exécuté dans le fichier functions.php d'un thème.

Voici le code pour le plugin FAQ_Post_Type; n'hésitez pas à modifier pour 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 éventuellement conserver les règles de vidage à l'intérieur du 'init' en cochant 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, laissez-moi savoir s'il existe des cas d'utilisation vous découvrez que cela ne résout pas.

12
MikeSchinkel