web-dev-qa-db-fra.com

Inclure une publication spécifique dans query_posts et la supprimer si elle est déjà dans la liste renvoyée

Nu avec moi. Tout d’abord, voici mon script complet pour les articles de mon curseur présentés:

<div id="featured" class="<?php if ( $responsive ) echo 'flexslider' . $featured_auto_class; else echo 'et_cycle'; ?>">
<a id="left-arrow" href="#"><?php esc_html_e('Previous','Aggregate'); ?></a>
<a id="right-arrow" href="#"><?php esc_html_e('Next','Aggregate'); ?></a>

<?php if ( $responsive ) { ?>
    <ul class="slides">
<?php } else { ?>
    <div id="slides">
<?php } ?>
<?php global $ids;
$ids = array();
$arr = array();
$i=0;

$featured_cat = get_option('aggregate_feat_cat');
$featured_num = (int) get_option('aggregate_featured_num');

if (get_option('aggregate_use_pages') == 'false') query_posts("showposts=$featured_num&top=billboard"); // set which slug in custom taxonomy TOP it should filter
else {
    global $pages_number;

    if (get_option('aggregate_feat_pages') <> '') $featured_num = count(get_option('aggregate_feat_pages'));
    else $featured_num = $pages_number;

    query_posts(array
    ('post_type' => 'page',
        'orderby' => 'menu_order',
        'order' => 'ASC',
        'post__in' => (array) get_option('aggregate_feat_pages'),
        'showposts' => (int) $featured_num
    ));
} ?>
<?php if (have_posts()) : while (have_posts()) :
    global $post;
    if (!$first_time) // START custom first post
    {
        $post_id = 105; // This is the ID of the first post to be displayed on slider
        $post = get_post($post_id);
        $first_time = 1;
    }
    else the_post(); // END custom first post
    ?>
    <?php if ( $responsive ) { ?>
            <li class="slide">
        <?php } else { ?>
            <div class="slide">
        <?php } ?>
    <?php
    $width = $responsive ? 960 : 958;
    $height = 340;
    $small_width = 95;
    $small_height = 54;
    $titletext = get_the_title();

    $thumbnail = get_thumbnail($width,$height,'',$titletext,$titletext,false,'Featured');

    $arr[$i]['thumbnail'] = get_thumbnail($small_width,$small_height,'',$titletext,$titletext,false,'Small');
    $arr[$i]['titletext'] = $titletext;

    $thumb = $thumbnail["thumb"];
    print_thumbnail($thumb, $thumbnail["use_timthumb"], $titletext, $width, $height, ''); ?>
    <div class="featured-top-shadow"></div>
    <div class="featured-bottom-shadow feat<?php $category = get_the_category(); echo $category[0]->category_nicename; ?>"></div>
    <div class="featured-description">
        <div class="feat_desc">
            <h2 class="featured-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
            <p><?php $excerpt = get_the_excerpt(); echo string_limit_words($excerpt,20); ?></p>
        </div>
    </div> <!-- end .description -->
    <?php if ( $responsive ) { ?>
            </li> <!-- end .slide -->
    <?php } else { ?>
            </div> <!-- end .slide -->
    <?php } ?>
    <?php $ids[] = $post->ID; $i++; endwhile; endif; wp_reset_query(); ?>
<?php if ( $responsive ) { ?>
    </ul> <!-- end .slides -->
<?php } else { ?>
</div> <!-- end #slides -->
<?php } ?>
</div> <!-- end #featured -->

Il query_posts un nombre défini de publications de la taxonomie personnalisée top=billboard. La partie suivante du code:

<?php if (have_posts()) : while (have_posts()) :
    global $post;
    if (!$first_time) // START custom first post
    {
        $post_id = 105; // This is the ID of the first post to be displayed on slider
        $post = get_post($post_id);
        $first_time = 1;
    }
    else the_post(); // END custom first post
    ?>

Ajoute l'ID de l'article 105 au premier article de la liste renvoyée. Cela me permet de contrôler quel poste est affiché en premier. Le problème est : Si post ID 105 est déjà inclus dans la taxonomie personnalisée top=billboard, il apparaîtra deux fois dans la liste ... donc une fois car il a été ajouté dans le script custom first post ci-dessus, et une fois, car il a été ajouté dans la taxonomie personnalisée top=billboard.

Comment puis-je ajuster mon code afin que si post ID 105 existe dans la taxonomie personnalisée top=billboard, alors il devrait ne pas apparaître deux fois (uniquement en tant que premier message).

2
Christine Cooper

D'accord, j'ai donc essayé de lire votre code et j'ai échoué. Je l'ai reformaté car il est actuellement illisible. Toute erreur est masquée par cette illisibilité. Je ne saurais trop insister sur l'importance de mettre correctement en retrait et de suivre un formatage standard pour vous simplifier la vie à l'infini:

<?php
$featured_class = 'et_cycle';
$tag = 'ul';
$attr = 'class';
if($responsive){
    $featured_class = 'flexslider' . $featured_auto_class;
    $tag = 'div';
    $attr = 'id';
}

?>
<div id="featured" class="<?php echo $featured_class; ?>">
    <a id="left-arrow" href="#"><?php esc_html_e( 'Previous', 'Aggregate' ); ?></a>
    <a id="right-arrow" href="#"><?php esc_html_e( 'Next', 'Aggregate' ); ?></a>
    <?php


    echo '<'.$tag.' '.$attr.'="slides">';

    global $ids;
    $ids = array();
    $arr = array();
    $i=0;

    $featured_cat = get_option( 'aggregate_feat_cat' );
    $featured_num = (int) get_option( 'aggregate_featured_num' );

    $query_args = array();
    if ( get_option( 'aggregate_use_pages' ) == 'false' ){
        // set which slug in custom taxonomy TOP it should filter
        $query_args = array(
            'showposts' => $featured_num,
            'top' => 'billboard'
        );
    }else {
        global $pages_number;

        if ( get_option( 'aggregate_feat_pages' ) <> '' ){
            $featured_num = count( get_option( 'aggregate_feat_pages' ) );
        } else{
            $featured_num = $pages_number;
        }
        query_args = array(
                'post_type' => 'page',
                'orderby' => 'menu_order',
                'order' => 'ASC',
                'post__in' => (array) get_option( 'aggregate_feat_pages' ),
                'showposts' => (int) $featured_num
        );
    }

    // needs to die, use WP_Query instead
    query_posts($query_args);


    if ( have_posts() ) {
        while ( have_posts() ) {
            global $post;
            // START custom first post
            if ( !$first_time ) {
                $post_id = 105; // This is the ID of the first post to be displayed on slider
                $post = get_post( $post_id );
                $first_time = 1;
            }else{
                the_post(); // END custom first post
            }
            if ( $responsive ) {
                echo '<li';
            }else {
                echo '<div';
            }
            echo ' class="slide">';
            $width = $responsive ? 960 : 958;
            $height = 340;
            $small_width = 95;
            $small_height = 54;
            $titletext = get_the_title();

            $thumbnail = get_thumbnail( $width, $height, '', $titletext, $titletext, false, 'Featured' );

            $arr[$i]['thumbnail'] = get_thumbnail( $small_width, $small_height, '', $titletext, $titletext, false, 'Small' );
            $arr[$i]['titletext'] = $titletext;

            $thumb = $thumbnail["thumb"];
            print_thumbnail( $thumb, $thumbnail["use_timthumb"], $titletext, $width, $height, '' );
            ?>
            <div class="featured-top-shadow"></div>
            <div class="featured-bottom-shadow feat<?php $category = get_the_category(); echo $category[0]->category_nicename; ?>"></div>
            <div class="featured-description">
                <div class="feat_desc">
                    <h2 class="featured-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
                    <p><?php $excerpt = get_the_excerpt(); echo string_limit_words( $excerpt, 20 ); ?></p>
                </div>
            </div> <!-- end .description -->
                <?php if ( $responsive ) { ?>
                        </li> <!-- end .slide -->
                <?php } else { ?>
                        </div> <!-- end .slide -->
                <?php } ?>
                <?php $ids[] = $post->ID; $i++;
        }
    }

    wp_reset_query();
    echo '</'.$tag.'>';
    ?>
</div> <!-- end #featured -->

Vous remarquerez que j'ai fait quelques simplifications et échangé les déclarations if afin qu'elles utilisent toutes {} plutôt qu'un mélange de raccourci et de standard.

Il y a un certain nombre de problèmes ici, l'un à la fin étant wp_reset_query, et la plus grande sonnette d'alarme étant l'utilisation de query_posts.

Je vous recommande vivement de ne jamais utiliser query_posts et d'utiliser plutôt WP_Query ou get_posts.

Le coupable ici est votre boucle:

        while ( have_posts() ) {
            global $post;
            // START custom first post
            if ( !$first_time ) {
                $post_id = 105; // This is the ID of the first post to be displayed on slider
                $post = get_post( $post_id );
                $first_time = 1;
            }else{
                the_post(); // END custom first post
            }

Nous voyons ici le début de votre boucle de publication, il vérifie s’il ya des publications supplémentaires, puis appelle the_post pour avancer.

Cependant, lorsque le premier message arrive, vous n’appelez pas the_post, la boucle ne peut donc pas avancer. Ce n'est pas comme cela qu'une boucle devrait fonctionner, vous devriez toujours appeler the_post quand même.

Au lieu de cela, je vous suggérerais de spécifier dans votre requête de ne pas inclure l'article 105. (J'éviterais également de coder en dur l'ID de l'article, il se peut que ce ne soit pas toujours un 105).

Donc, pour commencer, utilisez le paramètre post__not_in sur votre requête, par exemple:

$query_args['post__not_in'] = array(105);
1
Tom J Nowell

j'utilise pre_get_posts. Exemple:

add_action('pre_get_posts','search_filterr');function search_filterr($query) {
    if ( !is_admin() && $query->is_main_query() )   {
        if ( $query->is_search ) { //$query->is_category or etc...except is_page()
            $arrs[]='post';
            $arrs[]='page';
            $arrs[]='my_carss';
            $query->set('post_type',  $arrs );
        }
    }
}
0
T.Todua