パーマリンクのカスタム投稿タイプにカテゴリを追加する
私は人々が以前にこれを尋ね、カスタム投稿タイプを追加することまで行って、そしてパーマリンクのために書き直すことを知っています。
問題は私が使い続けたい340の既存のカテゴリーがあるということです。私は/ category/subcategory/postnameを見ることができるようになりました
今私はcustomposttype/postnameのスラッグを持っています。カテゴリを選択してもパーマリンクに表示されなくなりました... adminのパーマリンク設定を別のものに変更したことはありません。
足りないものや、このコードに追加する必要があるものはありますか?
function jcj_club_post_types() {
register_post_type( 'jcj_club', array(
'labels' => array(
'name' => __( 'Jazz Clubs' ),
'singular_name' => __( 'Jazz Club' ),
'add_new' => __( 'Add New' ),
'add_new_item' => __( 'Add New Jazz Club' ),
'edit' => __( 'Edit' ),
'edit_item' => __( 'Edit Jazz Clubs' ),
'new_item' => __( 'New Jazz Club' ),
'view' => __( 'View Jazz Club' ),
'view_item' => __( 'View Jazz Club' ),
'search_items' => __( 'Search Jazz Clubs' ),
'not_found' => __( 'No jazz clubs found' ),
'not_found_in_trash' => __( 'No jazz clubs found in Trash' ),
'parent' => __( 'Parent Jazz Club' ),
),
'public' => true,
'show_ui' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'menu_position' => 5,
'query_var' => true,
'supports' => array(
'title',
'editor',
'comments',
'revisions',
'trackbacks',
'author',
'excerpt',
'thumbnail',
'custom-fields',
),
'rewrite' => array( 'slug' => 'jazz-clubs-in', 'with_front' => true ),
'taxonomies' => array( 'category','post_tag'),
'can_export' => true,
)
);
カスタムの投稿タイプ書き換えルールを追加する場合、カバーすべき攻撃ポイントは2つあります。
書き換えルール
これは、WP_Rewrite::rewrite_rules()
のwp-includes/rewrite.php
で書き換えルールが生成されるときに発生します。 WordPressを使用すると、投稿、ページ、さまざまな種類のアーカイブなどの特定の要素の書き換えルールをフィルタリングできます。 posttype_rewrite_rules
が表示される場所で、posttype
部分はカスタム投稿タイプの名前である必要があります。あるいは、標準の投稿ルールも削除しない限り、post_rewrite_rules
フィルターを使用できます。
次に、実際に書き換えルールを生成する関数が必要です。
// add our new permastruct to the rewrite rules
add_filter( 'posttype_rewrite_rules', 'add_permastruct' );
function add_permastruct( $rules ) {
global $wp_rewrite;
// set your desired permalink structure here
$struct = '/%category%/%year%/%monthnum%/%postname%/';
// use the WP rewrite rule generating function
$rules = $wp_rewrite->generate_rewrite_rules(
$struct, // the permalink structure
EP_PERMALINK, // Endpoint mask: adds rewrite rules for single post endpoints like comments pages etc...
false, // Paged: add rewrite rules for paging eg. for archives (not needed here)
true, // Feed: add rewrite rules for feed endpoints
true, // For comments: whether the feed rules should be for post comments - on a singular page adds endpoints for comments feed
false, // Walk directories: whether to generate rules for each segment of the permastruct delimited by '/'. Always set to false otherwise custom rewrite rules will be too greedy, they appear at the top of the rules
true // Add custom endpoints
);
return $rules;
}
遊び回ることを決めた場合、ここで注意すべき主なものは「ウォークディレクトリ」ブール値です。パーマ構造の各セグメントに対して書き換えルールを生成し、書き換えルールの不一致を引き起こす可能性があります。 WordPress URLが要求されると、書き換えルールの配列が上から下にチェックされます。一致が見つかるとすぐに、たとえばパーマ構造に貪欲な一致がある場合など、遭遇したものがすべてロードされます。 /%category%/%postname%/
およびwalkディレクトリがオンの場合、/%category%/%postname%/
AND /%category%/
の両方の書き換えルールを出力します。それが早すぎると、あなたは台無しになります。
パーマリンク
これは、投稿タイプのパーマリンクを解析し、パーマ構造(例: '/%year%/%monthnum%/%postname%/')を実際のURLに変換する関数です。
次の部分は、理想的にはwp-includes/link-template.php
にあるget_permalink()
関数のバージョンとなるものの簡単な例です。カスタム投稿パーマリンクはget_post_permalink()
によって生成されます。これは、get_permalink()
の大幅に改良されたバージョンです。 get_post_permalink()
はpost_type_link
によってフィルタリングされるため、これを使用してカスタムパーマ構造を作成しています。
// parse the generated links
add_filter( 'post_type_link', 'custom_post_permalink', 10, 4 );
function custom_post_permalink( $permalink, $post, $leavename, $sample ) {
// only do our stuff if we're using pretty permalinks
// and if it's our target post type
if ( $post->post_type == 'posttype' && get_option( 'permalink_structure' ) ) {
// remember our desired permalink structure here
// we need to generate the equivalent with real data
// to match the rewrite rules set up from before
$struct = '/%category%/%year%/%monthnum%/%postname%/';
$rewritecodes = array(
'%category%',
'%year%',
'%monthnum%',
'%postname%'
);
// setup data
$terms = get_the_terms($post->ID, 'category');
$unixtime = strtotime( $post->post_date );
// this code is from get_permalink()
$category = '';
if ( strpos($permalink, '%category%') !== false ) {
$cats = get_the_category($post->ID);
if ( $cats ) {
usort($cats, '_usort_terms_by_ID'); // order by ID
$category = $cats[0]->slug;
if ( $parent = $cats[0]->parent )
$category = get_category_parents($parent, false, '/', true) . $category;
}
// show default category in permalinks, without
// having to assign it explicitly
if ( empty($category) ) {
$default_category = get_category( get_option( 'default_category' ) );
$category = is_wp_error( $default_category ) ? '' : $default_category->slug;
}
}
$replacements = array(
$category,
date( 'Y', $unixtime ),
date( 'm', $unixtime ),
$post->post_name
);
// finish off the permalink
$permalink = home_url( str_replace( $rewritecodes, $replacements, $struct ) );
$permalink = user_trailingslashit($permalink, 'single');
}
return $permalink;
}
前述のように、カスタム書き換えルールセットおよびパーマリンクを生成するための非常に単純化されたケースであり、特に柔軟性はありませんが、開始するには十分なはずです。
不正行為
カスタム投稿タイプのパーマ構造を定義できるプラグインを作成しましたが、投稿のパーマリンク構造で%category%
を使用できるように、私のプラグインは%custom_taxonomy_name%
をサポートしますcustom_taxonomy_name
は分類法の名前です。 %club%
。
階層的/非階層的分類法で期待どおりに機能します。
私は解決策を見つけました!
(限りない研究の後..私は CUSTOM POST TYPE を持つことができます。example.com/category/sub_category/my-post-name
ここにコード(functions.phpまたはプラグイン):
//===STEP 1 (affect only these CUSTOM POST TYPES)
$GLOBALS['my_post_typesss__MLSS'] = array('my_product1','....');
//===STEP 2 (create desired PERMALINKS)
add_filter('post_type_link', 'my_func88888', 6, 4 );
function my_func88888( $post_link, $post, $sdsd){
if (!empty($post->post_type) && in_array($post->post_type, $GLOBALS['my_post_typesss']) ) {
$SLUGG = $post->post_name;
$post_cats = get_the_category($id);
if (!empty($post_cats[0])){ $target_CAT= $post_cats[0];
while(!empty($target_CAT->slug)){
$SLUGG = $target_CAT->slug .'/'.$SLUGG;
if (!empty($target_CAT->parent)) {$target_CAT = get_term( $target_CAT->parent, 'category');} else {break;}
}
$post_link= get_option('home').'/'. urldecode($SLUGG);
}
}
return $post_link;
}
// STEP 3 (by default, while accessing: "EXAMPLE.COM/category/postname"
// WP thinks, that a standard post is requested. So, we are adding CUSTOM POST
// TYPE into that query.
add_action('pre_get_posts', 'my_func4444', 12);
function my_func4444($q){
if ($q->is_main_query() && !is_admin() && $q->is_single){
$q->set( 'post_type', array_merge(array('post'), $GLOBALS['my_post_typesss'] ) );
}
return $q;
}
解決策を手に入れた!
カスタム投稿タイプの階層型パーマリンクを作成するには、カスタム投稿タイプパーマリンク( https://wordpress.org/plugins/custom-post-type-permalinks - )プラグインをインストールします。
登録されている投稿の種類を更新します。ヘルプセンターとして投稿タイプ名があります
function help_centre_post_type(){
register_post_type('helpcentre', array(
'labels' => array(
'name' => __('Help Center'),
'singular_name' => __('Help Center'),
'all_items' => __('View Posts'),
'add_new' => __('New Post'),
'add_new_item' => __('New Help Center'),
'edit_item' => __('Edit Help Center'),
'view_item' => __('View Help Center'),
'search_items' => __('Search Help Center'),
'no_found' => __('No Help Center Post Found'),
'not_found_in_trash' => __('No Help Center Post in Trash')
),
'public' => true,
'publicly_queryable'=> true,
'show_ui' => true,
'query_var' => true,
'show_in_nav_menus' => false,
'capability_type' => 'page',
'hierarchical' => true,
'rewrite'=> [
'slug' => 'help-center',
"with_front" => false
],
"cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/",
'menu_position' => 21,
'supports' => array('title','editor', 'thumbnail'),
'has_archive' => true
));
flush_rewrite_rules();
}
add_action('init', 'help_centre_post_type');
そしてここに登録された分類法があります
function themes_taxonomy() {
register_taxonomy(
'help_centre_category',
'helpcentre',
array(
'label' => __( 'Categories' ),
'rewrite'=> [
'slug' => 'help-center',
"with_front" => false
],
"cptp_permalink_structure" => "/%help_centre_category%/",
'hierarchical' => true,
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'show_in_nav_menus' => true,
'query_var' => true
)
);
}
add_action( 'init', 'themes_taxonomy');
これはあなたのパーマリンクを動かす線です
"cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/",
あなたは%post_id%
を削除することができ、/%help_centre_category%/%postname%/"
を維持することができます
ダッシュボードからパーマリンクをフラッシュすることを忘れないでください。