私はリストを作成するプラグインに取り組んでいます。リストを作成したら、URLからナメクジを削除したい
投稿タイプ:
$rewrite = [
'slug' => 'single-link',
'with_front' => false,
'pages' => false,
'feeds' => false,
];
$args = [
'label' => esc_html__( 'Single Link', 'single-link' ),
'labels' => $labels,
'supports' => [ 'title' ],
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'menu_position' => 15,
'menu_icon' => 'dashicons-admin-links',
'show_in_admin_bar' => false,
'show_in_nav_menus' => true,
'can_export' => true,
'has_archive' => false,
'exclude_from_search' => true,
'publicly_queryable' => true,
'rewrite' => $rewrite,
'capability_type' => 'page',
'show_in_rest' => true,
];
$args = apply_filters( 'single-link/post_type/args', $args );
register_post_type( 'single-link', $args );
URLからスラッグを削除します。
function remove_cpt_slug( $post_link, $post, $leavename ) {
if ( 'single-link' != $post->post_type || 'publish' != $post->post_status ) {
return $post_link;
}
$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
return $post_link;
}
add_filter( 'post_type_link', 'remove_cpt_slug', 10, 3 );
function change_slug_struct( $query ) {
if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
return;
}
if ( ! empty( $query->query['name'] ) ) {
$query->set( 'post_type', array( 'post', 'single-link', 'page' ) );
}
}
add_action( 'pre_get_posts', 'change_slug_struct' );
(このコードは here からのものです)
今すぐpublishを押すと、slug/single-link /が削除されますが、ページにアクセスすると常に404が返されます。パーマリンクの変更/再保存は役に立ちませんでした。何がおかしいのですか?
カスタム投稿タイプの登録およびパーマリンクの修正はOKです。問題はWordPressの書き換え規則にあり、ページへの単純なリンクの「クリーンアップ」されたURLにおそらく一致し、change_slug_struct()
関数が想定していたpagename
ではなくname
query varが設定されます。
そのため、すべての場合を考慮して関数をこれに変更します。
function change_slug_struct( $query ) {
if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
return;
}
if ( ! empty( $query->query['name'] ) ) {
$query->set( 'post_type', array( 'post', 'single-link', 'page' ) );
} elseif ( ! empty( $query->query['pagename'] ) && false === strpos( $query->query['pagename'], '/' ) ) {
$query->set( 'post_type', array( 'post', 'single-link', 'page' ) );
// We also need to set the name query var since redirect_guess_404_permalink() relies on it.
$query->set( 'name', $query->query['pagename'] );
}
}
add_action( 'pre_get_posts', 'change_slug_struct' );
あなたはパーマ構造を変える必要があります。デフォルトでは、あなたのカスタム投稿タイプの投稿は、URLがスラッグ接頭辞で始まる場所でしか見つかりません。プレフィックスを変更するときは、削除するときと同じような問題があります。 この投稿を見てください 。
ポストタイプのスラッグプレフィックスを削除するには、 single-link_rewrite_rules
にフックしてそれらのルールを繰り返し、そこからプレフィックスも削除する必要があります。
注: perma構造の変更は、URLの衝突を引き起こす可能性があります。