web-dev-qa-db-ja.com

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

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

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

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

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

私は主にnoobですが、物事を通して私の道を邪魔するのはかなり得意です。書き換えを試みたことは一度もありませんが、それについてのある特定の方向を認めるでしょう。

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

8
daxitude

こんにちは@ daxitude:

最初に考え直してください。各FAQに個別のFAQページがない場合:

  1. 検索エンジンの最適化のために表面を減らし、あなたが得るかもしれない潜在的なトラフィックを減らします、そして

  2. 誰かがspecificFAQをメールで友人と共有したり、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'])

これはhackですが、あなたがやりたいことをするために必要なハックです。 unset($wp_rewrite->extra_permastructs['faq'])'init'フックを使用します。 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!
}

それについてです。

もちろん、上記の'init'フックでの$wp_rewrite->flush_rules()の使用は 本当に悪い習慣です 一度、私はFAQ_Post_Typeと呼ばれる完全な自己完結型のプラグインを実装して、正しく実行しました。このプラグインは、FAQ投稿タイプに必要なURLルールを追加し、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);
}

あなたの選択。

とにかく、これが解決しないとわかったユースケースがあれば教えてください。

12
MikeSchinkel