web-dev-qa-db-fra.com

Opérations avec les valeurs de champs personnalisés dans une boucle

J'ai un foreach pour afficher tous les messages dans un filtre de taxonomie par termes.
J'ai un champ personnalisé pour afficher une valeur numérique.
Ce dont j'ai besoin, c’est de faire deux opérations mathématiques avec toutes les valeurs de ce champ, toutes postées de ce terme.

Je veux dire:

La taxonomie X a 4 termes.
Chaque terme a 4 posts.
Chaque message a 1 champ personnalisé.
Je dois faire la somme de toutes les valeurs de custom_field de ce terme et de la moyenne de ce champ personnalisé.

Donc, pour l'instant j'ai:

<?php foreach ( $prod_terms as $prod_term ) {
$prod_query = new WP_Query( array(
 'post_type' => 'prod_cientifica',
 'prod_area' => $post_slug,
 'tax_query' => array(
    array(
    'taxonomy' => 'prod_tipo',
    'terms' => array( $prod_term->slug ),
    'operator' => 'IN',
    'get' => 'all', 
    'field' => 'slug'
    )
)
) );

if ( $prod_query->have_posts() ) : while ( $prod_query->have_posts() ) : $prod_query->the_post(); ?>

<div class="areaItem">
 <h4><?php the_title(); ?></h4>
 <p class="autores"><?php the_field('prod_autores'); ?></p>
 <p class="info"><?php the_field('prod_info'); ?></p>
 <p class="info"><?php the_field('prod_fi'); ?></p>
</div>
<?php endwhile; endif; ?>

Ce dont j'ai besoin, c'est de faire la somme de tous les champs prod_fi de chaque terme. En outre, la moyenne de ce champ aussi.

Une idée?

Merci!

- Modifier avec le code.

J'ai essayé plusieurs options maintenant. Le plus proche était celui-ci:

<?php
if ( $prod_query->have_posts() ) : while ( $prod_query->have_posts() ) : $prod_query->the_post(); 
$total_fi = array();
$meta_key = 'prod_fi';//set this to your custom field meta key
$total_fi = $wpdb->get_col($wpdb->prepare
    ("SELECT meta_value FROM wp_postmeta as pm
    INNER JOIN wp_term_relationships as tr ON (pm.post_id = tr.object_id) 
    INNER JOIN wp_term_taxonomy as tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
    WHERE 1
    AND tt.taxonomy = 'prod_tipo'
    AND pm.meta_key = %s", 
    $meta_key));
    echo 'Total FI '.array_sum( $total_fi );
    ?>

Mais celui-ci me montre le montant total de tous les champs custom_field en taxonomie.

celui-ci, ne s'arrête pas de somme à chaque terme, il continue.

$factorI = get_field('prod_fi'); 
if($factorI) {$factor_total += $factorI;}
echo $factor_total;

Merci.


J'ai trouvé une solution à ce problème. Je sais que ce n'est pas la bonne façon, s'il vous plaît, si quelqu'un sait comment faire, je serai heureux !!!

<?php
//start the foreach for each term in taxonomy
foreach ( $prod_terms as $prod_term ) {
$prod_query = new WP_Query( array(
    'post_type' => 'prod_cientifica',
    'prod_area' => $post_slug,
    'tax_query' => array(
         array(
            'taxonomy' => 'prod_tipo',
            'terms' => array( $prod_term->slug ),
            'operator' => 'IN',
            'get' => 'all', 
            'field' => 'slug'
            )
         )
) );
?>
<div class="area">
    <h2><?php echo $prod_term->name; ?></h2>
    <?php 
             // First while for fetch the value of "prod_fi" and make the math.
             while ( $prod_query->have_posts() ) : $prod_query->the_post(); 
        $factorI = get_field('prod_fi'); 
        if($factorI) {$factor_total += $factorI;}
                    // count post for average math operation
        $count_posts = $prod_query->current_post + 1;
        $factorP = $factor_total / $count_posts;
    endwhile; ?>
    <p class="areasPublicados"><?php _e('Publicados: ', 'twentytwelve'); ?> <?php echo $count_posts; ?></p>
    <p class="areasFI fleft"><?php _e('FI medio: ', 'twentytwelve'); ?> <?php echo $factorP; ?> </p><p class="areasFI fright"><?php _e('FI: ', 'twentytwelve'); ?> <?php echo $factor_total; ?></p>

    <?php
             //original query to fetch the post in the term
    if ( $prod_query->have_posts() ) : while ( $prod_query->have_posts() ) : $prod_query->the_post(); ?>
    <div class="areaItem">
        <h4><?php the_title(); ?></h4>
        <p class="autores"><?php the_field('prod_autores'); ?></p>
        <p class="info"><?php the_field('prod_info'); ?></p>
            </div>
     <?php endwhile; endif; ?>
</div>
<?php
// Reset math operation of factor_total, so it don't continue sum
   $factor_total = null;
   $prod_query = null;
   wp_reset_postdata();
 } //endforeach
?>

Edité à nouveau!

<?php
 // Fetch all post in taxonomy divided by terms.
 foreach ( $prod_terms as $prod_term ) {
    $prod_query = new WP_Query( array(
    'post_type' => 'prod_cientifica',
    'prod_area' => $post_slug,
    'tax_query' => array(
        array(
        'taxonomy' => 'prod_tipo',
        'terms' => array( $prod_term->slug ),
        'operator' => 'IN',
        'get' => 'all', 
        'field' => 'slug'
        )
    )
) );
?>
<?php if($prod_query->have_posts()) : ?>
    <div class="area">
    <h2><?php echo $prod_term->name; ?></h2>
    <?php 
    // Declare total and count before loop
    $factorTotal = 0;
    $factorCount = 0;
    // First loop to fetch prod_fi value
    while ( $prod_query->have_posts() ) : $prod_query->the_post(); 
                $factorI = get_field('prod_fi'); 
        if($factorI) { // Only if it exists
                  $factorTotal += $factorI; // Add it
                  $factorCount++; // Count it
        }
    endwhile; ?>
    <p class="areasPublicados">
       <?php _e('Publicados: ', 'twentytwelve'); ?> <?php echo $factorCount; ?>
    </p>
    <p class="areasFI fleft">
       <?php _e('FI medio: ', 'twentytwelve'); ?> <?php echo $factorTotal; ?> 
    </p>
    <p class="areasFI fright">
       <?php _e('FI: ', 'twentytwelve'); ?> <?php echo ($factorTotal / $factorCount); ?>
    </p>

    <?php
    if ( $prod_query->have_posts() ) : while ( $prod_query->have_posts() ) : $prod_query->the_post(); ?>
        <div class="areaItem">
        <h4><?php the_title(); ?></h4>
        <p class="autores"><?php the_field('prod_autores'); ?></p>
        <p class="info"><?php the_field('prod_info'); ?></p>
        </div>
    <?php endwhile; endif; ?>
</div>
<?php endif; ?>
<?php
// Reset things, for good measure
$factor_total = null;
$prod_query = null;
wp_reset_postdata();
} //enforeach
?>
1
KalymaStudio

Voici un moyen simple de faire cela:

// First declare total and count before the loop
$total = 0;
$count = 0;

foreach($posts as $post)
{
     if(get_field('prod_fi')){ // If we have a value add it to the total and count it
        $total += get_field('prod_fi');
        $count++;
     }
}

echo 'Count: '. $count;
echo 'Total Sum: '. $total;
echo 'Average: '.($total / $count); // To get the average

MODIFIER:

Dans votre cas, où vous avez la boucle $ prod_query, espérons que cela aura plus de sens :)

// Declare total and count before loop
$factorTotal = 0;
$factorCount = 0;

while ( $prod_query->have_posts() ) : $prod_query->the_post(); 
    $factorI = get_field('prod_fi'); 
    if($factorI){ // Only if it exists
        $factorTotal += $factorI; // Add it
        $factorCount++; // Count it
    } // end if
endwhile;

echo 'Count: '. $factorCount;
echo 'Total Sum: '. $factorTotal;
echo 'Average: '.($factorTotal / $factorCount);
3
Erevald