wake-up-neo.com

Gibt es eine Möglichkeit, einen Begriff zu deaktivieren, anstatt ihn zu löschen?

Ich habe eine Situation, in der ich einen Begriff aus einer Taxonomie entfernen muss. Es gibt jedoch Elemente, die mit dieser Taxonomie verknüpft sind. Manchmal sind diese Umzüge nur vorübergehend (dh wir beenden den Versand in ein Land, möchten jedoch, dass die Artikel mit diesen Ländern verbunden bleiben, wenn wir wieder in dieses Land versenden).

Gibt es eine Möglichkeit, einen Begriff zu deaktivieren, anstatt wp_delete_term? Vielen Dank!

4
jsanc623

Nicht direkt, aber ich brauche diese Funktionalität auch. Als Teil eines Plugins schreibe ich für einen Client und denke, das ist ein ziemlich guter Einstieg in eine Implementierung.

Der Ansatz, den ich verwende, besteht darin, ein Term-Meta zu speichern, wenn der Term deaktiviert ist, und dann den get_terms_defaults-Filter zu aktivieren, um deaktivierte Terme zu entfernen, die von WP Core-Aufrufen an get_terms(), get_the_terms() usw. zurückgegeben würden.

Mein Plugin kapselt all dies in eine Klasse, die als Wrapper für register_taxonomy() dient. Das Folgende ist eine abgespeckte Version dieser Klasse (für das Plugin, das ich schreibe, kann dieser Wrapper viel mehr mit benutzerdefinierten Taxonomien).

Siehe Custom_Taxonomy::enable_term() und Custom_Taxonmy::disable_term() für den Code, der den relevanten Begriff Meta hinzufügt/löscht; In Custom_Taxonomy::strip_disabled_terms() finden Sie den Code, mit dem deaktivierte Begriffe entfernt werden.

Hoffentlich habe ich den gesamten relevanten Code aus dieser Klasse weggelassen, als ich das Material entfernt habe, das für diese Frage nicht zutrifft :-)

/**
 * this class is a wrapper around register_taxonomy(), that adds additional functionality
 * to allow terms in the taxonomy so registered to be "disabled".
 *
 * Disabled terms will NOT be returned by the various WP Core functions like get_terms(),
 * get_the_terms(), etc.
 *
 * TODO: make sure that this works correctly given WP Core's object caching, see Custom_Taxonomy::strip_disabled_terms()
 */
class
Custom_Taxonomy
{
    const DISABLED_TERM_META_KEY = '_shc_disabled' ;

    public $name ;
    public $can_disable_terms = false ;

    /**
     * construct an instance of Custom_Taxonomy
     *
     * @param $taxonomy string Taxonomy key, must not exceed 32 characters
     * @param $post_types array|string post type or array of post types with which the taxonomy should be associated
     * @param $args array Array or query string of arguments for registering a taxonomy
     *
     * params are the same as WP's register_taxonomy() except that $args may have extra keys:
     *
     *  'can_disable_terms' => true|false
     */
    function
    __construct ($taxonomy, $post_types, $args)
    {
        $this->name = $taxonomy ;

        // modify args, if needed
        $default_args = array (
            'can_disable_terms' => false,
            ) ;
        $args = wp_parse_args ($args, $default_args) ;

        $this->can_disable_terms = $args['can_disable_terms'] ;
        unset ($args['can_disable_terms']) ;

        if ($this->can_disable_terms) {
            // TODO: is there a better filter to hook into than 'get_terms_defaults'?
            // I've tried 'get_terms_args', but that seems to be called too late
            // in the process of builing the WP_Term_Query used by get_terms(), etc
            // to have the meta_query that is added by $this->strip_disabled_terms()
            add_filter ('get_terms_defaults', array ($this, 'strip_disabled_terms'), 10, 2) ;
            }

        // register the taxonomy
        register_taxonomy ($taxonomy, $post_types, $args) ;

        return ;
    }

    /**
     * disable a term
     *
     * disabling a term will make it appear as if the term does not exist, without actually deleting it
     *
     * @param $term int|string|WP_Term the term to disable
     * @param $taxonomy string the taxonomy term is in
     * @return int|WP_Error|bool Meta ID on success. WP_Error when term_id is ambiguous between taxonomies. False on failure
     */
    function
    disable_term ($term, $taxonomy = '', $field = 'name')
    {
        if (!$this->can_disable_terms) {
            return ;
            }

        $taxonomy = $taxonomy ? $taxonomy : $this->name ;
        if (is_string ($term)) {
            $term = get_term_by ($field, $term, $taxonomy) ;
            }
        else {
            $term = get_term ($term, $taxonomy) ;
            }

        return (add_term_meta ($term->term_id, self::DISABLED_TERM_META_KEY, true, true)) ;
    }

    /**
     * enable a term
     *
     * @param $term int|WP_Term the term to disable
     * @param $taxonomy string the taxonomy term is in
     * @return bool True on success, false on failure
     */
    function
    enable_term ($term, $taxonomy = '', $field = 'name')
    {
        if (!$this->can_disable_terms) {
            return ;
            }

        $taxonomy = $taxonomy ? $taxonomy : $this->name ;
        if (is_string ($term)) {
            $term = get_term_by ($field, $term, $taxonomy) ;
            }
        else {
            $term = get_term ($term, $taxonomy) ;
            }

        return (delete_term_meta ($term->term_id, self::DISABLED_TERM_META_KEY)) ;
    }

    /**
     * strip disabled terms from e.g., get_terms() and get_the_terms()
     *
     * TODO: make sure that this works correctly given WP Core's object caching
     *
     * @param $term int|WP_Term the term to disable
     * @param $taxonomy string the taxonomy term is in
     * @return bool True on success, false on failure
     */
    function
    strip_disabled_terms ($args, $taxonomies)
    {
        if (!$this->can_disable_terms) {
            return ($args) ;
            }

        // I *think* the count('taxonomy') check is necesary because get_terms_args() is
        // applied by the WP Core object_term caching infrastructure by
        // passing all taxonomies for a given post_type, and we only want to
        // add this restriction when we are getting the terms for just the
        // this taxonomy
        if (count ($args['taxonomy']) != 1 || !in_array ($this->name, $args['taxonomy'])) {
            return ($args) ;
            }

        $args['meta_query'] = array (
            array (
                'key' => self::DISABLED_TERM_META_KEY,
                'compare' => 'NOT EXISTS',
                )
            ) ;

        return ($args) ;
    }
}

Mein Anwendungsfall

Ich habe 2 benutzerdefinierte Beitragstypen, type_a und type_b. type_b hat eine benutzerdefinierte Taxonomie, taxonomy_b, deren Begriffe die post_titles aller Posts des Typs type_a sind.

Nur die Beiträge von type_a, deren post_statuspublish ist, sollten die entsprechenden Begriffe in taxonomy_b aktiviert haben. Ich beende dies, indem ich mich in save_post_type_a einhänge, um die Begriffe einzufügen (falls sie noch nicht existieren) und sie zu aktivieren/deaktivieren, und indem ich mich in delete_post einhänge, um sie zu löschen.

Wenn Ihr Anwendungsfall für Begriffe mit Behinderung überhaupt ähnlich ist, sollten Sie mit den oben genannten zumindest in eine mögliche Richtung weisen.

Fragen habe ich noch

Ich arbeite immer noch an diesem Plugin und es gibt ein paar offene Fragen bezüglich seiner Implementierung.

  1. ist der get_terms_defaults-Filter, mit dem ich die meta_query zu WP_Term_Query hinzufüge, der beste Hook? Ich habe get_terms_args ausprobiert, aber das scheint zu spät aufgerufen zu werden, wenn die von get_terms () usw. verwendete WP_Term_Query erstellt wird, um die von Custom_taxonomy::strip_disabled_terms() hinzugefügte meta_query korrekt zu verarbeiten.

  2. Ich bin nicht sicher, wie dies mit dem Objekt-Caching von WP Core interagiert. Wenn beispielsweise ein Begriff deaktiviert ist, wenn ein Aufruf von get_terms() die Begriffe in der Taxonomie zwischenspeichert, und dieser Begriff in derselben Ausführung von wp() aktiviert wird, enthält ein nachfolgender Aufruf von get_terms() den Begriff oder gibt die zwischengespeicherten Begriffe zurück. .das würde den Begriff nicht enthalten. Aber es scheint in den Tests zu funktionieren, die ich bisher gemacht habe.

Wenn jemand, der dies liest, Verbesserungsvorschläge für diese Klasse hat, insbesondere zum Objekt-Caching-Aspekt, bitte, machen Sie mit!

Sie können Ihre Begriffe vorübergehend von den Abfragen ausschließen. Das bedeutet, dass Sie sie auf einigen Listingseiten usw. ausblenden. Alle ausgeschlossenen Begriffe werden nicht gelöscht, und Artikel-Links bleiben unberührt.

Holen Sie sich alle Länder außer Atlantis, El Dorado und Lemuria:

<?php
$args = array(
    'post_type'  => 'A_POST_TYPE', // change this
    'tax_query' => array(
        array(
            'taxonomy' => 'countries',
            'field'    => 'slug',
            'operator' => 'NOT IN', // operator to test
            'terms'    => array( // countries to exclude
                'atlantis',
                'el-dorado',
                'lemuria'
            ) 
        )
    )
);

$result = new WP_Query($args);

Weitere Informationen finden Sie unter WP_Query()Taxonomy Parameters .

Bearbeiten

Seit 4.4 gibt es term meta, mit dem Sie sich beispielsweise den Weg markieren können. "Deaktiviert", "Versteckt" oder so.

https://www.smashingmagazine.com/2015/12/how-to-use-term-meta-data-in-wordpress/

Auf jeden Fall müssen Sie Ihre Fragen besser überdenken.

2
Max Yudin