web-dev-qa-db-fra.com

Combinaison de type d'article personnalisé et de catégorie d'article

Comment interroger tous les articles du type d'article personnalisé ("vidéos") ou d'une catégorie d'articles ("vidéo") en boucle?

J'ai réussi à créer une requête qui combine les publications d'un type de publication personnalisé et les publications normales à l'aide du code ci-dessous, mais je ne parviens pas à atteindre le même objectif avec un type de publication personnalisé et une catégorie de publication.

<?php $args = array_merge( $wp_query->query, array( 'post_type' => array( 'post', 'videos', ) ) ); query_posts( $args ); ?>     
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

Toute aide serait appréciée!

Voici à quoi mes diapositives ressemblent:

if($query->have_posts()){
while ( $query->have_posts() ) {
    $query->the_post();
    $carousel_slide = '<li>
               <a href="<?php the_permalink(); ?>">
               <div class="tile-image"><?php the_post_thumbnail('tile-small-thumb'); ?></div>
               <div class="tile-up-arrow"></div>
               <div class="videoslider">Video</div>
               <div class="tile-post-title">
                   <h5><?php the_titlesmall('', '...', true, 55); ?></h5>
               </div>
               <div class="hover-display" ></div>
               </a>
           </li>';
    $found_posts[] = $post->ID;
    $slides[] = $carousel_slide;
}
wp_reset_postdata();

}

Tout d'abord, je reçois un Parse error: syntax error, unexpected T_STRING sur <?php the_post_thumbnail('tile-small-thumb'); ?> et un Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING sur <h5><?php the_titlesmall('', '...', true, 55); ?></h5>. Supprimer ces éléments charge la page sans problème, mais ne rend pas les liens sous forme de liens, mais plutôt sous la forme <?php the_permalink(); ?>.

Si je me trompe simplement ici, faites-le-moi savoir et je terminerai cette question.

Merci encore pour votre temps.

1
kallekillen

Doit avoir les deux

Le tableau d'arguments suivant recherche les variables post-type-slug videos et category-slug video. Il n'utilise pas la pagination en définissant posts_per_page sur -1 et renvoie uniquement les publications publiées.

$args = array(
    'post_type' => 'videos', 
    'category_name' => 'video', 
    'posts_per_page' => -1,
    'post_status' => 'publish'
  );

Soit ceci ou cela

Si vous essayez d'afficher des publications avec SOIT le type de message OR le slug de catégorie, utilisez deux requêtes, car elles ne peuvent PAS être combinées de quelque manière que ce soit du tableau d'arguments.

$args = array(
    'post_type' => 'videos', 
    'posts_per_page' => -1,
    'post_status' => 'publish'
  );

$args = array(
    'category_name' => 'video',
    'posts_per_page' => -1,
    'post_status' => 'publish'
  );

Cependant, je remarque que vous utilisez query_posts(). Si vous essayez de modifier la boucle principale, veuillez ne pas le faire. Utilisez le crochet pre_get_posts à la place. Si vous recherchez ceci pour une boucle secondaire, utilisez plutôt WP_Query .

avec WP_Query

function create_slide() {
     return '<li>
           <a href="'. esc_attr( esc_url( get_the_permalink() ) ) .'">
           <div class="tile-image">' . get_the_post_thumbnail('tile-small-thumb') . '</div>
           <div class="tile-up-arrow"></div>
           <div class="videoslider">Video</div>
           <div class="tile-post-title">
               <h5>' . get_the_title() . '</h5>
           </div>
           <div class="hover-display"></div>
           </a>
       </li>';
}

$slides = array();
$displayed = array();
$args = array(
    'post_type' => 'videos', 
    'posts_per_page' => -1,
    'post_status' => 'publish'
);
$query = new WP_Query( $args );
while ( $query->have_posts() ) : $query->the_post();
    $displayed[] = get_the_ID();
    $slides[] = create_slide();
endwhile;

$args = array(
    'category_name' => 'video',
    'posts_per_page' => -1,
    'post_status' => 'publish',
    'post__not_in' =>  $displayed,
);

$query = new WP_Query( $args );
while ( $query->have_posts() ) : $query->the_post();
    $displayed[] = get_the_ID();
    $slides[] = create_slide();
endwhile;

wp_reset_postdata();

echo implode('', $slides);
3
Derk-Jan

Pour faire un OR plutôt qu'un AND, vous auriez besoin d'une logique personnalisée, ce qui serait fastidieux, mais inutile!

Au lieu d’essayer d’obtenir les articles ET la catégorie, vous devez faire 2 requêtes individuelles pour saisir ce que vous voulez, alors prenez tous les articles de la vidéo, mettez-les dans un tableau, puis prenez tous les articles de la catégorie vidéo, ajoutez-les à la liste. même tableau, puis imprimez ce que vous avez.

Un peu comme mettre des oranges dans votre panier, puis des bannanas, plutôt que de chercher sans cesse une boîte qui contient à la fois des oranges et des bannanas

$slides = array();
$found_posts = array();
// get the video posts
$query = new WP_Query(
    array(
        'post_type' => 'videos',
        'posts_per_page' => -1
    )
);
if($query->have_posts()){
    while ( $query->have_posts() ) {
        $query->the_post();
        $carousel_slide = 'put your slide content here, so probably an <li> element or something?';
        $found_posts[] = $post->ID;
        $slides[] = $carousel_slide;
    }
    wp_reset_postdata();
}

// get the video category
$query = new WP_Query(
    array(
        'category_name' => 'video',
        'posts_per_page' => -1
        'post__not_in' =>  $found_posts
    )
);
if($query->have_posts()){
    while ( $query->have_posts() ) {
        $query->the_post();
        $carousel_slide = 'put your slide content here, so probably an <li> element or something?';
        $slides[] = $carousel_slide;
    }

    wp_reset_postdata();
}

// we should now have all our slides in the $slides array so lets print them out

echo implode('',$slides);

Vous devrez modifier cette ligne qui apparaît deux fois:

$carousel_slide = 'put your slide content here, so probably an <li> element or something?';

Pour qu'il contienne le slide html de l'article, j'imagine qu'il s'agira probablement d'un élément li, de quelques appels pour récupérer l'image en vedette, etc., mais cela dépasse le cadre de cette question (qui concerne les requêtes, pas la configuration de JCarousel. diapositives et images en vedette).

1
Tom J Nowell