WP dodaje -2 na końcu mojego slug. Gdzie są przechowywane oryginały, abym mógł je usunąć?
Udało mi się to uruchomić. Używałem numerycznych ślimaków dla niestandardowych typów postów (CPT), ale automatycznie otrzymywały one sufiks -2. Na przykład example/test/2 był przekształcany w example/test/2-2. Po pewnych badaniach i testach udało mi się rozwiązać ten problem, zachowując jednocześnie względy SEO. Oto rozwiązanie, które wdrożyłem:
Rozwiązanie
Oto kod, którego użyłem do obsługi numerycznych ślimaków w niestandardowych typach wpisów bez dodawania sufiksu -2:
function create_example_cpt() {
$labels = array(
'name' => 'Example',
'singular_name' => 'Example',
'add_new' => 'Add New',
'add_new_item' => 'Add New Item',
'edit_item' => 'Edit Item',
'new_item' => 'New Item',
'all_items' => 'All Items',
'view_item' => 'View Item',
'search_items' => 'Search Items',
'not_found' => 'No items found',
'not_found_in_trash' => 'No items found in Trash',
'parent_item_colon' => 'Parent Item:',
'menu_name' => 'Example'
);
$args = array(
'labels' => $labels,
'public' => true,
'hierarchical' => true,
'supports' => array('title', 'editor', 'page-attributes'),
'rewrite' => array(
'slug' => 'example',
'with_front' => false,
'hierarchical' => true
),
'has_archive' => true,
'menu_position' => 5,
'show_in_rest' => true,
);
register_post_type('example', $args);
}
add_action('init', 'create_example_cpt');
function custom_unique_slug($slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug) {
global $wpdb;
// Check only 'example' CPT and numeric slugs
if ( 'example' != $post_type || ! is_numeric( $original_slug ) || $slug === $original_slug ) {
return $slug;
}
// Search for existing slugs to avoid conflicts
$post_name_check = $wpdb->get_var( $wpdb->prepare(
"SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type = %s AND ID != %d AND post_parent = %d LIMIT 1",
$original_slug, $post_type, $post_ID, $post_parent
) );
// If there are no conflicts, return the original slug
if ( ! $post_name_check ) {
return $original_slug;
}
// Otherwise, return the slug with the suffix
return $slug;
}
add_filter( 'wp_unique_post_slug', 'custom_unique_slug', 10, 6 );
function custom_rewrite_rules($rules) {
$new_rules = array(
'example/([^/]+)/([^/]+)/?$' => 'index.php?post_type=example&name=$matches[2]',
'example/([^/]+)/?$' => 'index.php?post_type=example&name=$matches[1]',
);
return $new_rules + $rules;
}
add_filter('rewrite_rules_array', 'custom_rewrite_rules');
Wyjaśnienie
- create_example_cpt: Rejestruje niestandardowy typ wpisu ze wsparciem hierarchicznym. Dostosuj tę funkcję do swoich konkretnych potrzeb.
- custom_unique_slug: Zapewnia, że numeryczne ślimaki zostaną zapisane bez sufiksu, jeśli nie wykryto żadnych konfliktów.
- custom_rewrite_rules: Dodaje niestandardowe reguły przepisywania w celu obsługi pożądanej struktury adresu URL.
Notatki
- Pamiętaj o odświeżeniu linków trwałych po dodaniu tego kodu, aby mieć pewność, że nowe reguły przepisywania zostaną zastosowane.
Dzięki temu rozwiązaniu moje podrzędne CPT nie otrzymają sufiksu example/test/2-2, ale zostaną zapisane jako example/test/2/. Będą również działać poprawnie i będą wyświetlane zgodnie z oczekiwaniami w mapach witryn.