Verhindern Sie, dass der Seiten-Slug den Archivierungs-Permalink des benutzerdefinierten Post-Typs stört?

In meinem Plugin erstelle ich einen benutzerdefinierten Post-Typ, der ein Archiv enthält und den Parameter rewrite verwendet, um einen Slug auszuwählen:

$args = array ( 'public' => true, 'has_archive' => true, 'rewrite' => array('slug' => 'lessons', 'with_front' => false) ); register_post_type ('my_plugin_lesson', $args); 

Mit diesem Code erhalte ich ein Archiv der ‘my_plugin_lesson’-Beiträge unter example.com/lessons/ .

Ich kann aber auch eine Seite mit dem Titel “Lessons” erstellen, und WordPress weist ihr die Slug-Lektionen zu. Der Link Seite anzeigen im Admin-Steuerfeld für diese Seite wird example.com/lessons/ , aber auf die Seite kann nicht example.com/lessons/ , weil WordPress das Archiv für meinen benutzerdefinierten Posttyp anzeigt.

Gibt es eine Möglichkeit, zu verhindern, dass WordPress einen Block für Seiten oder Beiträge auswählt, die den Slug meiner benutzerdefinierten Beitragstypen beeinträchtigen?

Solutions Collecting From Web of "Verhindern Sie, dass der Seiten-Slug den Archivierungs-Permalink des benutzerdefinierten Post-Typs stört?"

Ich weiß, dass du schon die Lösung findest, weil du herausgefunden hast, dass diese Frage bereits gestellt und beantwortet wurde …

Wenn diese Frage jedoch einmal eine Bounty ist und nicht als Duplikat geschlossen werden kann, möchte ich einen Sinn ergeben und (ein bisschen) zusätzlichen Wert auf die bereits geposteten Antworten hinzufügen.

Was in diesen Antworten getan wird (das von @RachelCarden und das hier von @ matthew-boynes ), ist das, was Sie brauchen, aber es ist hardcoded , dh Sie müssen den cpt archive slug in der Filterfunktion manuell hinzufügen.

Was ich erhalten möchte, ist ein Filter, der auf die gleiche Art und Weise funktioniert, aber in etwa wie folgt:

 add_filter('wp_unique_post_slug_is_bad_hierarchical_slug', 'prevent_slug_override', 99, 3); add_filter('wp_unique_post_slug_is_bad_flat_slug', 'prevent_slug_override', 99, 3); function prevent_slug_override( $now, $slug, $type ) { if ( in_array($type, array('nav_menu_item', 'revision', 'attachment') ) ) return $now; $cpts = get_post_types( array('_builtin' => false), 'objects' ); $check_bad = array(); foreach ( $cpts as $cpt => $object ) { if ( $object->has_archive ) { if ( ! empty($object->rewrite) && isset($object->rewrite['slug']) && ! empty($object->rewrite['slug']) && ($object->rewrite['slug'] != $cpt) ) { $check_bad[] = $object->rewrite['slug']; } else { $check_bad[] = is_string($object->has_archive) ? $object->has_archive : $cpt; } } } if ( in_array($slug, $check_bad) ) return true; return $now; } 

Ich glaube, dass Sie die Filter in wp_unique_post_slug nutzen wp_unique_post_slug , um diesen Konflikt zu verhindern. Versuche Folgendes

 function wpse_109072_is_slug_conflict( $false, $slug, $post_type ) { return ( 'page' == $post_type && 'lessons' == $slug ); } add_filter( 'wp_unique_post_slug_is_bad_hierarchical_slug', 'wpse_109072_is_slug_conflict', 10, 3 ); add_filter( 'wp_unique_post_slug_is_bad_flat_slug', 'wpse_109072_is_slug_conflict', 10, 3 );