web-dev-qa-db-fra.com

Compter les messages dans la catégorie, y compris les catégories enfants

J'ai trouvé ce code quelque part, il compte les posts mais seulement ceux qui appartiennent à une catégorie spécifique. J'apprécierais si quelqu'un pouvait développer cela afin qu'il compte tous les messages qui appartiennent également à ses catégories enfants?

function wp_get_cat_postcount($id) {

      $cat =  get_category_by_slug( $id ); 
      $count = (int)$cat->count;
      $taxonomy = 'category';
      $args = array(
        'child_of' => $id,
        );
      $tax_terms = get_terms($taxonomy,$args);
      foreach ($tax_terms as $tax_term) {
        $count +=$tax_term->count;
      }
      return $count;
    }
1
Marko

Les fonctions que vous utilisez sont brouillées et n’ont pas beaucoup de sens. En outre, il est très statique dans la mesure où vous ne pouvez pas renvoyer un nombre en fonction de paramètres personnalisés tels que le type de publication, le statut de la publication ou le champ personnalisé. Une autre chose à noter, si une publication appartient à un terme et à une de ses expressions enfantines, la publication sera comptée deux fois. Vous obtiendrez ainsi un nombre de publications supérieur à ce que vous avez réellement.

IMHO, je vais simplement utiliser une requête personnalisée pour rendre la fonction dynamique et pour renvoyer un nombre réel au lieu d'un nombre trop important en raison de publications appartenant à un terme parent et à un terme enfant.

L'IDÉE

Le tax_query a un paramètre appelé include_children, qui est défini par défaut sur true. Ce paramètre inclura tous les termes enfants des termes passés au paramètre terms, de sorte qu'il renverra les publications des termes passés et de tous ses enfants.

Deuxièmement, il suffit d’interroger un message pour obtenir le nombre de messages. Ce que WP_Query fait par défaut, il continuera à rechercher dans la base de données les messages correspondants, même s'il a déjà trouvé les messages requis qui calculent la requête. Ceci est effectué afin de calculer la pagination, et un nombre de toutes ces publications correspondant à la requête est stocké dans la propriété $found_posts de l'objet de requête.

Pour économiser sur les appels de base de données et le temps passé à le faire, nous interrogerons simplement le champ de publication ID et non l'objet complet WP_Post.

LE CODE

Tout d’abord quelques notes

  • Le code n'est pas testé et peut être un buggy. Assurez-vous de tester ceci en premier sur une installation de test locale avec le débogage activé.

  • Le code nécessite au minimum PHP 5.4.

Je commenterai le code au fur et à mesure pour que vous puissiez suivre et comprendre ce qui se passera.

/**
 * Funtion to get post count from given term or terms and its/their children
 *
 * @param (string) $taxonomy
 * @param (int|array|string) $term Single integer value, or array of integers or "all"
 * @param (array) $args Array of arguments to pass to WP_Query
 * @return $q->found_posts
 *
 */
function get_term_post_count( $taxonomy = 'category', $term = '', $args = [] )
{
    // Lets first validate and sanitize our parameters, on failure, just return false
    if ( !$term )
        return false;

    if ( $term !== 'all' ) {
        if ( !is_array( $term ) ) {
            $term = filter_var(       $term, FILTER_VALIDATE_INT );
        } else {
            $term = filter_var_array( $term, FILTER_VALIDATE_INT );
        }
    }

    if ( $taxonomy !== 'category' ) {
        $taxonomy = filter_var( $taxonomy, FILTER_SANITIZE_STRING );
        if ( !taxonomy_exists( $taxonomy ) )
            return false;
    }

    if ( $args ) {
        if ( !is_array ) 
            return false;
    }

    // Now that we have come this far, lets continue and wrap it up
    // Set our default args
    $defaults = [
        'posts_per_page' => 1,
        'fields'         => 'ids'
    ];

    if ( $term !== 'all' ) {
        $defaults['tax_query'] = [
            [
                'taxonomy' => $taxonomy,
                'terms'    => $term
            ]
        ];
    }
    $combined_args = wp_parse_args( $args, $defaults );
    $q = new WP_Query( $combined_args );

    // Return the post count
    return $q->found_posts;
}

USAGE

Vous pouvez utiliser la fonction des manières suivantes

CAS 1

Terme unique ( ID du terme 21) avec taxonomie de catégorie par défaut

$count = get_term_post_count( 'category', 21 );
echo $count;

CAS 2

Tableau d'identifiants de terme avec taxonomie personnalisée my_taxonomy

$count = get_term_post_count( 'my_taxonomy', [21, 41, 52] );
echo $count;

CAS 3

Terme unique issu de la taxonomie de la catégorie par défaut du type de publication personnalisé cpt et du statut de la publication trash

$args = [
    'post_type'   => 'cpt',
    'post_status' => 'trash'
];
$count = get_term_post_count( 'category', 21, $args );
echo $count;

USAGE 4

Si vous devez obtenir un nombre de publications pour tous les termes d’une taxonomie donnée, définissez simplement le paramètre $term sur

$count = get_term_post_count( 'category', 'all' );
echo $count;
2
Pieter Goosen