web-dev-qa-db-fra.com

Conditions pour enfants de plusieurs parents?

J'utilise isotope pour filtrer un type de publication personnalisé. Mais je ne veux que les taxonomies d'enfants de 2 parents particuliers. Je le fais bien fonctionner pour un parent, mais je ne suis pas sûr de savoir comment modifier le tableau pour permettre à 2 parents.

$terms = get_terms('speight_plans', array('parent' => 16)); // you can use any taxonomy, instead of just 'category'
    $count = count($terms); //How many are they?
        if ( $count > 0 ){  //If there are more than 0 terms
            foreach ( $terms as $term ) {  //for each term:
                echo '<button class="button" data-filter=".'.$term->slug.'">' . $term->name . '</button>';
                //create a list item with the current term slug for sorting, and name for label
            }
        }

J'ai essayé de faire

array('parent' => 16, 15));

Mais cela ne montre encore que les enfants du parent 16.

Toute aide que vous pouvez vous permettre serait très appréciée.

4
Laura Sage

Nous pouvons filtrer la requête SQL générée via le filtre terms_clauses avant que la requête SQL ne soit exécutée. Ce que nous allons faire est d'introduire un nouveau paramètre appelé wpse_parents qui acceptera un tableau d'identifiants de termes parents pour obtenir des enfants. Notez que ce nouveau paramètre fonctionne exactement comme le paramètre intégré, parent, car il ne renverra que les enfants directs du parent.

LE FILTRE

Le code est commenté pour faciliter la compréhension et la description de base de ce qu’un code particulier fait. Notez que tout le code nécessite au moins PHP 5.4.

add_filter( 'terms_clauses', function ( $pieces, $taxonomies, $args )
{
    // Bail if we are not currently handling our specified taxonomy
    if ( !in_array( 'speight_plans', $taxonomies ) )
        return $pieces;

    // Check if our custom argument, 'wpse_parents' is set, if not, bail
    if (    !isset ( $args['wpse_parents'] )
         || !is_array( $args['wpse_parents'] )
    ) 
        return $pieces;

    // If  'wpse_parents' is set, make sure that 'parent' and 'child_of' is not set
    if (    $args['parent']
         || $args['child_of']
    )
        return $pieces;

    // Validate the array as an array of integers
    $parents = array_map( 'intval', $args['wpse_parents'] );

    // Loop through $parents and set the WHERE clause accordingly
    $where = [];
    foreach ( $parents as $parent ) {
        // Make sure $parent is not 0, if so, skip and continue
        if ( 0 === $parent )
            continue;

        $where[] = " tt.parent = '$parent'";
    }

    if ( !$where )
        return $pieces;

    $where_string = implode( ' OR ', $where );
    $pieces['where'] .= " AND ( $where_string ) ";

    return $pieces;
}, 10, 3 );

Remarque: le filtre est construit de manière à ne pas autoriser la définition des paramètres parent et child_of. Si l'un de ces paramètres est défini, le filtre est abandonné rapidement et n'est pas appliqué.

UTILISATION DE BASE

Si vous devez interroger les termes enfants des termes 15 et 16, vous pouvez exécuter la requête suivante pour atteindre votre objectif.

$args = [
    'wpse_parents' => [15, 16]
];
$terms = get_terms( 'speight_plans', $args );
2
Pieter Goosen

Je peux penser à la fonction get_term_children(). Vous pouvez utiliser cette fonction deux fois pour extraire 2 tableaux de termes enfants, id de deux termes parents. Ensuite, vous pouvez les fusionner dans un tableau et le transmettre à get_terms

get_terms('speight_plans', array('include' => $child_terms_arr));
0
Tung Du