Description

Recalcule le compte d'un terme en incluant le compte des postes venant de ses termes enfants. S'assurer que les termes enfants sont tous dans l'argument $terms.

Paramètres

$terms

(array) (Requis) Liste des objets de terme passée en référence.

$taxonomy

(string) (Requis) Contexte du terme.

Structure de la fonction _pad_term_counts()

Définie dans le fichier wp-includes/taxonomy.php à la ligne 3706 :

function _pad_term_counts( &$terms, $taxonomy ) {
    global $wpdb;

    // This function only works for hierarchical taxonomies like post categories.
    if ( ! is_taxonomy_hierarchical( $taxonomy ) ) {
        return;
    }

    $term_hier = _get_term_hierarchy( $taxonomy );

    if ( empty( $term_hier ) ) {
        return;
    }

    $term_items  = array();
    $terms_by_id = array();
    $term_ids    = array();

    foreach ( (array) $terms as $key => $term ) {
        $terms_by_id[ $term->term_id ]       = & $terms[ $key ];
        $term_ids[ $term->term_taxonomy_id ] = $term->term_id;
    }

    // Get the object and term IDs and stick them in a lookup table.
    $tax_obj      = get_taxonomy( $taxonomy );
    $object_types = esc_sql( $tax_obj->object_type );
    $results      = $wpdb->get_results( "SELECT object_id, term_taxonomy_id FROM $wpdb->term_relationships INNER JOIN $wpdb->posts ON object_id = ID WHERE term_taxonomy_id IN (" . implode( ',', array_keys( $term_ids ) ) . ") AND post_type IN ('" . implode( "', '", $object_types ) . "') AND post_status = 'publish'" );

    foreach ( $results as $row ) {
        $id = $term_ids[ $row->term_taxonomy_id ];

        $term_items[ $id ][ $row->object_id ] = isset( $term_items[ $id ][ $row->object_id ] ) ? ++$term_items[ $id ][ $row->object_id ] : 1;
    }

    // Touch every ancestor's lookup row for each post in each term.
    foreach ( $term_ids as $term_id ) {
        $child     = $term_id;
        $ancestors = array();
        while ( ! empty( $terms_by_id[ $child ] ) && $parent = $terms_by_id[ $child ]->parent ) {
            $ancestors[] = $child;

            if ( ! empty( $term_items[ $term_id ] ) ) {
                foreach ( $term_items[ $term_id ] as $item_id => $touches ) {
                    $term_items[ $parent ][ $item_id ] = isset( $term_items[ $parent ][ $item_id ] ) ? ++$term_items[ $parent ][ $item_id ] : 1;
                }
            }

            $child = $parent;

            if ( in_array( $parent, $ancestors, true ) ) {
                break;
            }
        }
    }

    // Transfer the touched cells.
    foreach ( (array) $term_items as $id => $items ) {
        if ( isset( $terms_by_id[ $id ] ) ) {
            $terms_by_id[ $id ]->count = count( $items );
        }
    }
}

Fonctions utilisées par _pad_term_counts()

esc_sql()

Échappe les données pour être ensuite utilisées dans une requête Sql.

_get_term_hierarchy()

Retourne l'id des termes enfants d'une taxonomie.

is_taxonomy_hierarchical()

Détermine si la taxonomie est hiérarchique.

get_taxonomy()

Retourne l'objet d'une taxonomie en donnant son nom.

Où trouver la fonction _pad_term_counts() dans le CMS Wordpress

Sources

Codex Wordpress : _pad_term_counts()

Autres fonctions dans le même fichier : wp-includes/taxonomy.php

Retour