Tipo di post personalizzato, non è necessaria una visualizzazione singola, inoltre desidera riscrivere permalink che includano l'hash nell'URI


8

Stiamo utilizzando CPT per gestire una pagina di domande frequenti su un sito, in cui la domanda è il titolo del post e la risposta è il contenuto del post. C'è una pagina principale per le FAQ che mostra tutti i post (pagina di archivio FAQ). Con questa struttura non abbiamo davvero bisogno della vista singola per eventuali FAQ e infatti vorremmo ometterla dalla struttura del sito. Per indirizzare i permalink vorremmo impostarli come qualcosa di simile a example.com/faq/#uniqueIdentifier, pensando che useremo #uniqueIdentifier per abbinare un div sulla pagina dell'archivio contenente la risposta e richiamare l'attenzione su di esso in alcuni moda. UniqueIdentifier potrebbe essere ID post, titolo della domanda faq, dati da una meta-box o qualcos'altro.

Consentitemi quindi di ricapitolare ciò di cui ho bisogno per realizzare:

(1) riscrivere i permalink delle faq come / faq / # qualcosa e

(2) assicurarsi che tutto / faq / collegamenti instradino al modello di archivio e non singolo

Sono per lo più un noob ma abbastanza bravo a frugare nelle cose. Non ho mai tentato nessuna riscrittura, quindi apprezzerei qualche direzione particolare al riguardo.

Grazie.

Risposte:


12

Ciao @daxitude:

Vorrei prima suggerirti di riconsiderare. Se non hai singole pagine FAQ per ogni FAQ:

  1. Riduci la superficie per l'ottimizzazione dei motori di ricerca e riduci il potenziale traffico che potresti ottenere e

  2. Rendi impossibile per qualcuno condividere una FAQ specifica con un amico via e-mail e / o condividere con la propria rete su Facebook, Twitter, ecc. (Come utente sono sempre frustrato dagli sviluppatori del sito che non mi permettono di avere un URL diretto a un elemento e invece forzami a collegarmi alla pagina che elenca tutti gli elementi.)

Tuttavia, se vuoi ancora farlo, fai due cose:

1.) Utilizzare il 'post_type_link'gancio

Utilizza l' 'post_type_link'hook per modificare l'URL come nell'esempio seguente * (suppongo che il tuo tipo di post personalizzato sia 'faq'). Aggiungi quanto segue al functions.phpfile del tuo tema :

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'])

Questo è un trucco , ma è un trucco necessario per fare quello che vuoi. Usa un 'init'gancio per unset($wp_rewrite->extra_permastructs['faq']). Rimuove la regola di riscrittura che register_post_type()aggiunge. Sto includendo una chiamata per register_post_type()poter fornire un esempio completo sia per te che per gli altri:

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!
}

Questo è tutto.

Ovviamente l'uso sopra di $wp_rewrite->flush_rules()in un 'init'hook è davvero una cattiva pratica e dovrebbe davvero essere fatto solo una volta, quindi ho implementato un plugin completo e autonomo chiamato FAQ_Post_Typeper farlo bene. Questo plug-in aggiunge un tipo di post FAQ con le regole URL desiderate e utilizza a register_activation_hook()per svuotare le regole di riscrittura; l'attivazione è ovviamente una delle poche cose che richiede il codice plugin anziché il codice che può essere eseguito nel functions.phpfile di un tema .

Ecco il codice per il FAQ_Post_Typeplugin; sentiti libero di modificare per le tue esigenze:

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

Puoi anche mantenere le regole di flush all'interno 'init'di usando un controllo per un valore di opzione se preferisci questo:

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

La tua scelta.

Comunque, fammi sapere se ci sono casi d'uso che scopri che questo non risolve.


Ciao @MikeSchinkel. WOW! Sei certamente un individuo utile. Sono pienamente d'accordo sui punti da riconsiderare n. 1 e n. 2, ma credo che abbiamo affrontato principalmente queste preoccupazioni. Per il n. 1 - dal momento che stiamo visualizzando la domanda completa e la risposta sulla pagina dell'archivio cpt, una singola vista per ogni faq non sarebbe un contenuto duplicato e quindi non necessariamente favorevole per il SEO? Inoltre, abbiamo sentito che un'intera pagina per una sola domanda faq è un po 'agitando le braccia e preferiremmo fornire alle persone il contenuto più velocemente rispetto a dover fare clic su più collegamenti per arrivarci.
daxitude il

(apparentemente ci sono limiti di caratteri ai commenti e io sono un individuo prolisso!) Per il n. 2 - tutto ciò che segue l'hash nell'URI è abbinato a un div sulla pagina che contiene la risposta. tutte le altre risposte sono nascoste al caricamento della pagina e si aprono le diapositive delle risposte corrispondenti. In questo modo preserviamo completamente la capacità di condividere e salvare i collegamenti ... fintanto che non otteniamo instabilità e cambiamo questa struttura per qualche motivo sciocco.
daxitude,

Quanto alla tua risposta, il passaggio 1 è fantastico! In precedenza non avevo familiarità con questo hook e non avevo previsto una soluzione così accurata. Per curiosità, mi rendo conto che è possibile implementare il passaggio 1 e non il passaggio 2. In questo modo vengono inviati collegamenti faq all'URI appropriato, ma si preservano anche le singole pagine..e non ci colleghiamo mai al sito. Sembra un modo ragionevole di andare? Grazie.
daxitude,

@daxitude - È meglio impedire l'indicizzazione dei motori di ricerca su una pagina di archivio e consentire loro di indicizzare le singole pagine. Le due cose più importanti per la SEO sono la pagina <title>e <h1>Heading</h1>ne otterrai solo una su una pagina di archivio, ma ne avrai una a testa per le singole pagine FAQ. Concordo sul fatto che tutto il contenuto delle FAQ sia il migliore nella pagina di archivio, ma è possibile fornire tutto il contenuto nella pagina principale e una pagina di approfondimento per coloro che lo desiderano (che include i motori di ricerca) , e certamente non danneggia nulla; basta aggiungere un "Permalink" vicino alla domanda frequente.
MikeSchinkel,

@daxitude - Perché pensi che non abbia implementato il n. 2? Questo è lo scopo del codice che segue l'intestazione "2.) unset($wp_rewrite->extra_permastructs['faq'])" che, ovviamente, sto sostenendo che non usi. :)
MikeSchinkel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.