Jenis pos khusus, tidak perlu untuk tampilan tunggal, ditambah ingin menulis ulang permalink yang menyertakan hash dalam URI

8

Kami menggunakan CPT untuk mengelola halaman pertanyaan yang sering diajukan di situs, di mana pertanyaannya adalah judul posting dan jawabannya adalah konten posting. Ada halaman utama untuk FAQ yang menampilkan semua posting (halaman arsip FAQ). Dengan struktur ini, kami benar-benar tidak memerlukan tampilan tunggal untuk FAQ apa ​​pun dan bahkan ingin menghilangkannya dari struktur situs. Untuk mengatasi permalink kami ingin menetapkannya menjadi sesuatu seperti example.com/faq/#uniqueIdentifier, berpikir bahwa kami akan menggunakan #uniqueIdentifier untuk mencocokkan div di halaman arsip yang berisi jawaban dan meminta perhatian di beberapa mode. UniqueIdentifier dapat berupa ID pos, judul pertanyaan faq, data dari kotak meta, atau yang lainnya.

Jadi, saya rekap apa yang saya butuhkan yang perlu kita capai:

(1) menulis ulang permalink faq menjadi / faq / # something, dan

(2) pastikan semua / faq / tautan rute ke templat arsip dan tidak tunggal

Saya kebanyakan pemula tetapi cukup pandai meraba-raba jalan saya melalui hal-hal. Belum pernah mencoba penulisan ulang jadi akan menghargai beberapa arahan khusus tentang itu.

Terima kasih.

kelenturan
sumber

Jawaban:

12

Hai @ jarak:

Pertama-tama saya sarankan Anda mempertimbangkan kembali. Jika Anda tidak memiliki halaman FAQ individu untuk setiap FAQ:

  1. Anda mengurangi permukaan Anda untuk optimasi mesin pencari dan mengurangi potensi lalu lintas yang mungkin Anda dapatkan, dan

  2. Anda membuat seseorang tidak mungkin membagikan FAQ tertentu dengan teman melalui email dan / atau berbagi dengan jaringan mereka di Facebook, Twitter, dll. (Sebagai pengguna saya selalu frustrasi oleh pengembang situs yang melarang saya memiliki URL langsung ke suatu item dan sebaliknya memaksa saya untuk menautkan ke halaman yang mencantumkan semua item.)

Namun, jika Anda masih ingin melakukannya maka lakukan dua hal:

1.) Gunakan 'post_type_link'kaitnya

Gunakan 'post_type_link'kait untuk memodifikasi URL seperti pada contoh berikut * (Saya berasumsi tipe posting khusus Anda adalah 'faq'). Tambahkan berikut ini ke functions.phpfile tema Anda :

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

Ini adalah peretasan , tetapi peretasan yang diperlukan untuk melakukan apa yang Anda inginkan. Gunakan 'init'kait untuk unset($wp_rewrite->extra_permastructs['faq']). Ini menghapus aturan penulisan ulang yang register_post_type()menambahkan. Saya menyertakan panggilan register_post_type()agar saya dapat memberikan contoh lengkap untuk Anda dan orang lain:

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

Itu saja.

Tentu saja penggunaan di atas $wp_rewrite->flush_rules()dalam sebuah 'init'hook adalah praktik yang benar - benar buruk dan seharusnya hanya dilakukan sekali jadi saya telah mengimplementasikan plugin lengkap dan mandiri yang dipanggil FAQ_Post_Typeuntuk melakukannya dengan benar. Plugin ini menambahkan jenis posting FAQ dengan aturan URL yang Anda inginkan dan menggunakan a register_activation_hook()untuk menyiram aturan penulisan ulang; Aktivasi jelas merupakan salah satu dari beberapa hal yang memerlukan kode plugin alih-alih kode yang dapat dijalankan dalam functions.phpfile tema .

Berikut kode untuk FAQ_Post_Typeplugin; jangan ragu untuk memodifikasi untuk kebutuhan Anda:

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

Anda juga bisa menyimpan aturan flush di dalam 'init'dengan menggunakan tanda centang untuk nilai opsi jika Anda menginginkannya:

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

Pilihanmu.

Ngomong-ngomong, beri tahu saya jika ada kasus penggunaan Anda menemukan bahwa ini tidak mengatasi.

MikeSchinkel
sumber
Hai @ MikeSinkink. WOW! Anda tentu adalah individu yang membantu. Saya sepenuh hati setuju pada poin pertimbangan Anda # 1 dan # 2, tapi saya percaya kita sebagian besar telah mengatasi masalah ini. Untuk # 1 - karena kami menampilkan pertanyaan dan jawaban lengkap pada halaman arsip cpt, bukankah satu tampilan untuk setiap faq merupakan konten duplikat dan karenanya tidak selalu menguntungkan untuk SEO? Selain itu, kami merasa bahwa seluruh halaman hanya untuk satu pertanyaan faq adalah sedikit lambaian tangan dan kami lebih suka memberikan konten lebih cepat kepada orang lain daripada harus mengklik melalui lebih banyak tautan untuk sampai ke sana.
daxitude
(rupanya ada batas char untuk komentar dan saya seorang individu verbose!) Untuk # 2 - semuanya setelah hash di uri dicocokkan dengan div pada halaman yang berisi jawabannya. semua jawaban lainnya disembunyikan pada pemuatan halaman dan jawaban yang cocok terbuka. Dengan cara ini kami benar-benar menjaga kemampuan untuk berbagi dan menyimpan tautan ... selama kami tidak berubah-ubah dan mengubah struktur ini karena alasan konyol.
daxitude
Mengenai balasan Anda, langkah 1 fantastis! Saya sebelumnya tidak terbiasa dengan kait ini dan tidak mengantisipasi solusi yang rapi. Sebagai rasa ingin tahu, saya menyadari bahwa Anda dapat menerapkan langkah 1 dan bukan langkah 2. Ini mengirimkan tautan faq ke uri yang sesuai tetapi juga mempertahankan satu halaman..dan kami tidak pernah menautkannya melalui situs. Apakah ini sepertinya cara yang masuk akal? Terima kasih.
daxitude
@daxitude - Lebih baik untuk melarang pengindeksan mesin pencari pada halaman arsip dan memungkinkan mereka untuk mengindeks halaman individual. Dua hal yang paling penting untuk SEO adalah halaman <title>dan <h1>Heading</h1>Anda hanya akan mendapatkan satu dari itu pada halaman arsip tetapi Anda akan mendapatkannya masing - masing untuk halaman FAQ individu. Saya setuju bahwa semua konten FAQ adalah yang terbaik pada halaman arsip, tetapi Anda dapat memberikan semua konten pada halaman utama dan menelusuri halaman bagi mereka yang menginginkannya (yang termasuk mesin pencari) , dan tentu saja tidak ada salahnya; cukup tambahkan "Permalink" di dekat pertanyaan FAQ.
MikeSchinkel
@daxitude - Mengapa Anda pikir saya tidak menerapkan # 2? Itulah tujuan dari kode yang mengikuti judul "2.) unset($wp_rewrite->extra_permastructs['faq'])" yang, tentu saja, saya berpendapat bahwa Anda tidak menggunakan. :)
MikeSchinkel