Muestra varias publicaciones aleatorias, pero asegúrese de que se cumpla una condición

4

Tengo un tipo de publicación personalizada para un grupo de personas (empleados). Al principio, necesitaba mostrar 7 empleados al azar. Eso fue fácil

<?php 
    $args = array(
        'post_type' => 'employees',
        'orderby' => 'rand',
        'posts_per_page' => 7,
    );
    $query = new WP_Query($args);
    while ( $query->have_posts() ) { $query->the_post();
        //do stuff
    <?php endif;
    } wp_reset_postdata(); 

?>

Pero ahora me han pedido que me asegure de que al menos uno de los siete sea siempre una mujer. La relación hombre-mujer en la empresa es de 4 a 1.

He establecido una casilla de verificación que puedo probar:

<?php if( in_array( 'yes', get_field('is_female') ) ){
 // this is a female
}

Necesito ayuda para ponerlo todo junto. Supongo que debo seguir la pista si alguno de los mensajes que se muestran son mujeres. Una vez que llegue a la séptima posición si una mujer no figura en la lista, debo seguir iterando hasta que encuentre una.

¿Alguna sugerencia?

    
pregunta Christina 22.03.2015 - 02:49

2 respuestas

2

Creo que la mejor manera aquí sería ejecutar tres bucles separados aquí ( también puedes hacer dos bucles, pero luego necesitas obtener publicaciones completas en las consultas de hombres y mujeres, combinarlas y barajarlas ), los dos primeros se utilizarán para obtener 5 hombres y el segundo bucle obtendrá 2 mujeres. Puede ajustar esto según sea necesario. El tercer bucle utilizará la información de los dos primeros bucles para obtener las publicaciones completas.

Aquí acepto que está utilizando un campo personalizado que tiene dos valores separados, uno para hombres y otro para mujeres. Además, acepto que no es necesario que pagines esta consulta.

Puedes probar algo como esto

/*
 * First query to get 5 men. Only get post ID's to increase performance
 */
$args1 = array(
    'posts_per_page'   => 5,
    'orderby'          => 'rand',
    'suppress_filters' => true,
    'no_found_rows'    => true,
    'fields'           => 'ids',
    'meta_query'       => array(
        array(
            'key'   => 'custom-field-name',
            'value' => 'value-for-men',
        )
    )
);
$men = new WP_Query( $args1 );

/*
 * Second query to get 2 women. Only get post ID's to increase performance
 */
$args2 = array(
    'posts_per_page'   => 2,
    'orderby'          => 'rand',
    'suppress_filters' => true,
    'no_found_rows'    => true,
    'fields'           => 'ids',
    'meta_query'       => array(
        array(
            'key'   => 'custom-field-name',
            'value' => 'value-for-women',
        )
    )
);
$women = new WP_Query( $args2 );

/*
 * Merge the post id's from the two queries
 */
$merged_ids = array_merge( $women->posts, $men->posts );

/*
 * Use the merged array of post id's to get the complete posts. Use 'orderby' => 'post__in'
 * to keep shuffled order of the posts that will be returned
 */ 
$args3 = array( 
    'post__in' => shuffle( $merged_ids ),
    'orderby' => 'post__in'
);
$merged_queries = new WP_Query( $args3 ); 

?><pre><?php var_dump($merged_queries->posts); ?></pre><?php    
    
respondido por el Pieter Goosen 22.03.2015 - 13:17
2

Hice algunos ajustes. Una vez que creé mis dos arreglos, los combiné de esta manera

$merged_queries->posts = array_merge( $women->posts, $men->posts );
shuffle($merged_queries->posts);
$merged_queries->post_count = $women->post_count + $men->post_count;

while ( $merged_queries->have_posts() ) { $merged_queries->the_post();
// do stuff

Parece un poco lento, por lo que podría tener algo de redundancia o ineficiencia, pero me está dando los resultados que esperaba.

    
respondido por el Christina 24.03.2015 - 03:36

Lea otras preguntas en las etiquetas