Je travaille sur un plugin qui crée des listes. Après avoir créé une liste, j'ai voulu supprimer le slug de l'URL
Type de poste:
$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 );
Supprimer le slug de l'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' );
(ce code provient de ici )
Maintenant, après avoir cliqué sur publier, le slug/single-link/est supprimé, mais nous obtenons toujours un 404 lors de la visite de la page. Changer/ré-enregistrer les permaliens n'a pas aidé. Qu'est-ce que je fais mal?
L'enregistrement du type de message personnalisé et de la modification du lien permanent est OK. Le problème concerne les règles de réécriture de WordPress qui correspondront probablement à l'URL "nettoyée" de vos liens simples vers des pages et définiront la requête pagename
var et non name
comme fonction change_slug_struct()
.
Alors changez la fonction en ceci pour prendre en compte tous les cas:
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' );
Vous devez modifier la structure de perma. Par défaut, la publication de votre type de message personnalisé ne sera trouvée que si l'URL commence par le préfixe slug. Lorsque vous changez le préfixe, vous rencontrez des problèmes similaires à ceux rencontrés lors de sa suppression: jetez un coup d'œil à cet article .
Pour supprimer le préfixe slug de type post, vous devez vous accrocher à single-link_rewrite_rules
, parcourir ces règles et y supprimer également le préfixe.
Remarque: des modifications de la structure de perma peuvent provoquer des conflits d’URL.