サイト上のよくある質問ページを管理するためにCPTを使用しています。ここで、質問は投稿のタイトルで、答えは投稿のコンテンツです。すべての投稿を表示するFAQのメインページがあります(FAQアーカイブページ)。この構造では、FAQの単一のビューは実際には必要ないため、サイト構造から省略したいと思います。パーマリンクを解決するために、それらをexample.com/faq/#uniqueIdentifierのようなものに設定したいと思います。#uniqueIdentifierを使用して、回答を含むアーカイブページのdivに一致させ、それに注意を喚起することを考えます。ファッション。 uniqueIdentifierは、投稿ID、よくある質問のタイトル、メタボックスからのデータ、またはその他のものです。
それで、私が達成するために必要なものを要約しましょう。
(1)faqパーマリンクを/ faq /#somethingに書き換えます。
(2)すべての/ faq /リンクがアーカイブテンプレートにルーティングされ、単一ではないことを確認してください。
私は主にnoobですが、物事を通して私の道を邪魔するのはかなり得意です。書き換えを試みたことは一度もありませんが、それについてのある特定の方向を認めるでしょう。
ありがとうございました。
こんにちは@ daxitude:
最初に考え直してください。各FAQに個別のFAQページがない場合:
検索エンジンの最適化のために表面を減らし、あなたが得るかもしれない潜在的なトラフィックを減らします、そして
誰かがspecificFAQをメールで友人と共有したり、Facebook、Twitterなどのネットワークと共有したりできないようにします(ユーザーとして、サイトの開発者にいつもイライラしていて、アイテムへの直接のURLを許可せず、代わりにすべてのアイテムをリストするページへのリンクを強制します。)
ただし、引き続き行う場合は、次の2つのことを行います。
'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;
}
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);
}
あなたの選択。
とにかく、これが解決しないとわかったユースケースがあれば教えてください。