Lassen Sie nur 1 Instanz jedes Begriffs in jeder benutzerdefinierten Taxonomie zu

Ich suche nach einer function, die die Erstellung jedes Begriffs auf nur 1 Instanz innerhalb jeder benutzerdefinierten Taxonomie einschränkt. Jede benutzerdefinierte Taxonomie kann den gleichen Begriff haben, aber der Begriff darf nur einmal in jeder benutzerdefinierten Taxonomie vorkommen. Ich vermute, dass dies eine function für jede benutzerdefinierte Taxonomie benötigt.

Solutions Collecting From Web of "Lassen Sie nur 1 Instanz jedes Begriffs in jeder benutzerdefinierten Taxonomie zu"

Ziemlich interessante Frage. Ich kann wirklich nichts leichtes finden. Die wp_insert_term() wird von der function wp_insert_term() . Wenn Sie sich den Quellcode ansehen, werden Sie sehen, dass es wirklich nicht viele Filter oder Aktionen gibt, die wir vor der Terminierung verwenden können. pre_insert_term ist der einzige Filter, der vor der validation und Einfügung von pre_insert_term vorkommt.

Standardmäßig können Sie in einer hierarchischen Taxonomie Begriffe mit doppelten Namen verwenden, wenn diese Begriffe nicht in derselben Hierarchie liegen. Es gibt keinen Filter oder keine Aktion, um dieses Verhalten zu ändern. Daher ist es unsere Herausforderung, dieses Verhalten zu stoppen und sicherzustellen, dass wir nur eine Instanz eines Begriffs haben können.

Nichthierarchische Taxonomien haben dieses Problem nicht, da es nur Top-Level-Begriffe geben kann. Es kann keinen anderen Begriff mit dem gleichen Namen geben.

Es gibt jedoch eine Ausnahme zu den oben genannten Regeln. Wenn wir einen eindeutigen Slug explizit setzen, können wir Begriffe mit demselben Namen auf derselben Ebene haben. Wir werden dies jedoch allesamt auslassen und uns nur auf die gelieferte Bezeichnung konzentrieren

Es bleibt also nur der Filter pre_insert_term . Werfen wir einen Blick auf eine mögliche Lösung

 add_filter( 'pre_insert_term', function ( $term, $taxonomy ) { /** * Start by validating the term. The taxonomy is already validated * * If the term is a numeric or int value, we will bail. We will let wp_insert_term * handle the process from here on. This is just a very loose check on our side */ if ( is_numeric( $term ) ) return $term; /** * $term is a valid non numeric string, so we most probably have a term name * * We will now basically use the same logic as `wp_insert_term` to validate the $term * name. */ $term_name = strtolower( filter_var( $term, FILTER_SANITIZE_STRING ) ); /** * Get all terms which matchings names like $term_name * * Getting terms by name is not an exact match, but a LIKE comparison, so * if you have names like 'Term A', 'term a' and 'term A', they all will match. * We will need to do an exact match later on */ $name_matches = get_terms( $taxonomy, [ 'name' => $term_name, 'hide_empty' => false, 'fields' => 'names', // Only get term names ] ); // If $name_matches is empty, we do not have duplicates, bail if ( !$name_matches ) return $term; // Convert all names into lowercase $names_array = array_map( 'strtolower', $name_matches ); // Test to see if we have an exact term name match, if so, return WP_Error if ( in_array( $term_name, $names_array ) ) return new WP_Error( 'term_exists', __( 'You cannot have a term with the same name, choose a unique name.' ), $term ); // OK we have a unique term name, let 'wp_insert_term' continue the rest of the process return $term; }, 10, 2 ); 

Was wir getan haben, ist, alle Begriffe mit Namen wie dem Begriff, den wir einfügen möchten, zu erhalten, sie alle in Kleinbuchstaben umzuwandeln und dann zu testen, ob unser Termname im Array von Termnamen ist. Wenn dies der WP_Error , werden wir ein WP_Error Objekt zurückgeben, um den gesamten Begriffseinfügungsprozess zu stoppen

Offensichtlich brauchen Sie keine anderen Prüfungen zwischen Taxonomien, da Sie einen Begriff mit demselben Namen zwischen verschiedenen Taxonomien haben können.