WordPress : Afficher une page au hasard

Publié par Jean-Michel le

Je voudrais afficher une page aléatoire qui :

  • a une page parent de X ou Y ou Z, etc.
  • exclut les pages avec le titre « Contributeurs »

Le code suivant fonctionne (mais sans les conditions spécifiques ci-dessus), mais the_content n’affiche rien. Je ne sais pas ce qui ne va pas là-bas.

fwiw, ceci est une page modèle pour un thème enfant de Twenty Thirteen.

<?php
/*
Template Name: Random Page
*/

get_header(); ?>

    <div id="primary" class="content-area">
        <div id="content" class="site-content" role="main">

<?php
$args = array( 'post_type' => 'page', 'numberposts' => 1, 'orderby' => 'rand' );
$rand_posts = get_posts( $args );
foreach( $rand_posts as $post ) : ?>

                <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                    <header class="entry-header">

                        <h1 class="entry-title"><?php the_title(); ?></h1>
                    </header><!-- .entry-header -->

                    <div class="entry-content online-page">
                        <?php if($post->post_parent) {
    $parent_link = get_permalink($post->post_parent); ?>
<a href="<?php echo $parent_link; ?>" class="parent-link parent-header"><?php
$parent_title = get_the_title($post->post_parent);
echo $parent_title;
?></a>
<?php } ?>


                <?php the_content(); ?>


                        <?php wp_link_pages( array( 'before' => '<div class="page-links"><span class="page-links-title">' . __( 'Pages:', 'twentythirteen' ) . '</span>', 'after' => '</div>', 'link_before' => '<span>', 'link_after' => '</span>' ) ); ?>
                    </div><!-- .entry-content -->

                    <footer class="entry-meta">
                        <?php edit_post_link( __( 'Edit', 'twentythirteen' ), '<span class="edit-link">', '</span>' ); ?>
                    </footer><!-- .entry-meta -->
                </article><!-- #post -->

                <?php twentythirteen_post_nav(); ?>

<?php endforeach; ?>
<?php wp_reset_query(); ?>


        </div><!-- #content -->
    </div><!-- #primary -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>

Solution n°1 trouvée

La première condition que vous énumérez est facile. Vous avez juste besoin des post_parent__inarguments.

$args = array(
  'post_type' => 'page',
  'posts_per_page' => 1,
  'orderby' => 'rand',
  'post_parent__in' => array(2,169), // replace with your IDs
);
$rand = new WP_Query($args);
if ($rand->have_posts()) {
  while ($rand->have_posts()) {
    $rand->the_post();
    the_title();
    echo '<br>';
  }
}

Pour la deuxième condition, je crois que vous avez besoin d’un filtre. WP_Queryne peut pas gérer cette logique nativement, pour autant que je sache.

function restrict_post_name_wpse_130401($where) {
  remove_filter('posts_where','restrict_post_name_wpse_130401');
  return $where.' AND post_title != "Contributors"';
}
add_action('posts_where','restrict_post_name_wpse_130401');

$args = array(
  'post_type' => 'page',
  'posts_per_page' => 1,
  'orderby' => 'rand',
  'post_parent__in' => array(2,169), // replace with your IDs
);
$rand = new WP_Query($args);

if ($rand->have_posts()) {
  while ($rand->have_posts()) {
    $rand->the_post();
    the_title();
    echo '<br>';
  }
}

Utilisé exactement comme ci-dessus, cela devrait fonctionner correctement. Autrement dit, si vous ajoutez le filtre immédiatement avant votre requête, il s’exécutera et se supprimera, n’affectant qu’une seule requête.

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *