カスタム投稿タイプ、単一ビューの必要なし、URIにハッシュを含むパーマリンクの書き換えが必要


8

私たちはCPTを使用して、サイトのよくある質問ページを管理しています。質問は投稿のタイトルで、答えは投稿のコンテンツです。すべての投稿を表示するFAQのメインページ(FAQアーカイブページ)があります。この構造では、FAQを1つのビューで表示する必要はありません。実際、サイト構造からは省略したいと思います。パーマリンクに対処するには、それらをexample.com/faq/#uniqueIdentifierのように設定します。#uniqueIdentifierを使用して、回答が含まれているアーカイブページのdivに一致させ、いくつかのセクションに注意を向けるとしますファッション。uniqueIdentifierは、投稿ID、よくある質問のタイトル、メタボックスのデータなどです。

それで、達成するために必要なものを要約します。

(1)faqパーマリンクを/ faq /#somethingに書き換えます。

(2)すべての/ faq /リンクが単一ではなくアーカイブテンプレートにルーティングされることを確認してください

私はほとんど初心者ですが、物事を自分の方法で探すのはかなり得意です。書き直しを試みたことは一度もないので、特定の方向性を教えていただければ幸いです。

ありがとうございました。

回答:


12

こんにちは@daxitude:

まず、あなたに考え直してもらいましょう。各FAQに個別のFAQページがない場合:

  1. 検索エンジン最適化のための表面を減らし、得られる可能性のある潜在的なトラフィックを減らします。

  2. 誰かが共有するためにあなたはそれが不可能に特定のなどFacebookやTwitter、上の彼らのネットワークと電子メールおよび/または株を超える友人とよくある質問の直接URLを持っている私はいつも私を許可しないサイトの開発者が不満を感じていたユーザのように(アイテムに移動し、代わりにすべてのアイテムを一覧表示するページにリンクするように強制します。)

ただし、それでもやりたい場合は、次の2つのことを行います。

1.)'post_type_link'フックを使用する

'post_type_link'フックを使用して、次の例のようにURLを変更します*(カスタムの投稿タイプはであると想定しています'faq')。以下をテーマのfunctions.phpファイルに追加します。

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

これはハックですが、やりたいことをするために必要なハックです。'init'フックを使用しunset($wp_rewrite->extra_permastructs['faq'])ます。register_post_type()追加した書き換えルールを削除します。register_post_type()あなたと他の人の両方に完全な例を提供できるように、への呼び出しを含めています。

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

それだけです。

もちろん、上記の使用$wp_rewrite->flush_rules()'init'フックがあり、本当に悪い習慣と私が呼ばれる完全な自己完結型のプラグイン実装しましたので、後は実際には行われるべきであるFAQ_Post_Type右のそれを行うことを。このプラグインは、必要なURLルールを含むFAQ投稿タイプを追加し、それを使用しregister_activation_hook()て書き換えルールをフラッシュします。アクティベーションは明らかに、テーマのfunctions.phpファイルで実行できるコードの代わりにプラグインコードを必要とする数少ないものの1つです。

これがFAQ_Post_Typeプラグインのコードです。要件に合わせて自由に変更してください:

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

'init'必要に応じて、オプション値のチェックを使用して、フラッシュルールを内に保持することもできます。

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

あなたの選択。

とにかく、これで対応できないユースケースがあるかどうかをお知らせください。


こんにちは@MikeSchinkel。うわー!あなたは確かに親切な人です。私はあなたの再検討ポイント#1と#2について心から同意しますが、私たちはこれらの懸念にほとんど対処してきたと信じています。#1の場合-質問と回答全体をcptアーカイブページに表示しているので、各faqの単一のビューはコンテンツが重複していて、必ずしもSEOに適しているとは限りませんか?これに加えて、1つだけのFAQ質問のページ全体が少し手を振っているように感じ、そこに到達するためにより多くのリンクをクリックする必要があるよりも、より速くコンテンツを人々に提供したいと思っています。
ダクシチュード

(どうやらコメントには文字数制限があり、私は冗長な個人です!)#2の場合-URIのハッシュの後のすべてが、回答を含むページのdivに一致します。他のすべての回答はページの読み込み時に非表示になり、一致する回答スライドが開きます。このようにして、リンクを共有および保存する機能を完全に維持します。気まぐれにならず、愚かな理由でこの構造を変更しない限り。
11

返信については、ステップ1は素晴らしいです。私は以前このフックに慣れておらず、そのようなきちんとした解決策を予想していませんでした。好奇心として、ステップ1ではなくステップ1を実装できることを理解しています。これにより、faqリンクが適切なURIに送信されますが、単一のページも保持されます。また、サイトを通じてリンクすることはありません。これは合理的な方法のように見えますか?ありがとうございました。
ダクシチュード

@daxitude-アーカイブページでの検索エンジンのインデックス作成を禁止し、個々のページのインデックス作成を許可することをお勧めします。SEOで最も重要な2つのインポートはページ<title><h1>Heading</h1>あり、アーカイブページではそのうちの1つしか取得できませんが、個別のFAQページごと1つずつ取得できます。すべてのFAQコンテンツがアーカイブページに最適であることに同意しますが、メインページそれを必要とする人(検索エンジンを含む)のドリルダウンページすべてのコンテンツを提供でき、それは確かに何も害しません。FAQの質問の近くに「パーマリンク」を追加するだけです。
MikeSchinkel

@daxitude-なぜ私は#2を実装しなかったと思いますか?それが、見出し「2.)unset($wp_rewrite->extra_permastructs['faq'])」に続くコードの目的ですもちろん、これは使用しないと主張しています。:)
MikeSchinkel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.