web-dev-qa-db-fra.com

Pages supprimées apparaissant lors de la recherche de pages enfants

J'utilise le code suivant pour afficher l'image sélectionnée, les post_titles et les données de champs personnalisés à partir de pages enfants pertinentes.

<?
$child_pages = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_parent = ".$post->ID." AND post_type = 'page' ORDER BY 'title ASC' ", 'OBJECT');

if ( $child_pages ) :
    foreach ( $child_pages as $pageChild ) :
        setup_postdata( $pageChild );
        $thumbnail = get_the_post_thumbnail($pageChild->ID, 'thumbnail');
        if($thumbnail == "") continue; // Skip pages without a thumbnail
?>
        <div class="child-thumb">
          <a href="<?= get_permalink($pageChild->ID) ?>" rel="bookmark" title="<?= $pageChild->post_title ?>">
            <?= $thumbnail ?><br />
           <?php echo get_post_meta($pageChild->ID, 'textfield', true); ?> </a><br /> <! -- Add riding-->
            <?= $pageChild->post_title ?>

        </div>
    <?
        endforeach;
    endif;
    ?>

Cependant, il affiche également les pages enfants qui ont été supprimées. Comment puis-je l'empêcher de vérifier la corbeille et d'afficher les pages supprimées?

Je vous remercie!

1
SPS

Vous utilisez une requête SQL brute pour effectuer une requête de publication, ce qui est mauvais, car:

  • Il y a déjà des API qui font ça
  • Il n'hérite plus des paramètres par défaut
  • Il ne passe pas par le système de mise en cache, donc il peut être plus lent

Intead, utilisez WP_Query.

La raison pour laquelle vous recevez des publications supprimées est que vous ne spécifiez pas le statut de publication que vous souhaitez. Par défaut, WP_Query n'est publié que par défaut.

Voici votre boucle de publication équivalente:

$query = new WP_Query( array(
    'post_type' => 'page',
    'post_parent' => $post->ID,
    'posts_per_page' => -1,
    'orderby' => 'title',
    'order' => 'ASC'
) );

if ( $query->have_posts() ) {
    while( $query->have_posts() ) {
        $query->the_post();
        // process each post
    }
}
1
Tom J Nowell

À moins qu'il existe une très bonne raison (en règle générale, ou bien bien sûr, une incapacité des fonctions principales à faire ce dont vous avez besoin) pour utiliser des demandes SQL brutes afin de récupérer des publications et d'autres données dans WordPress, vous ne devez pas créer vos propres requêtes SQL. Au lieu de cela, vous pouvez utiliser WP_Query . Dans votre cas, vous pouvez récupérer les messages comme ceci:

$query = new WP_Query( array(
    'post_type' => 'page',
    'post_parent' => $post->ID,
    'posts_per_page' => -1,
    'orderby' => 'title',
    'order' => 'ASC'
) );

$posts = $query->posts;

Le problème avec votre requête SQL est qu’elle ne tient pas compte du statut de la publication (trash pour les publications mises à la corbeille). WP_Query exclut automatiquement les publications supprimées (et les révisions, etc.), mais constitue avant tout une couche d'abstraction et présente de nombreux autres avantages, tels que le filtrage.

3
engelen

Utilisez get_posts () ou WP_Query pour les requêtes secondaires. Ils utiliseront le statut de publication 'publier' par défaut.

Si vous souhaitez toujours utiliser une requête personnalisée, ajoutez-lui le statut de publication.

$child_pages = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_status = 'publish' AND post_parent = ".$post->ID." AND post_type = 'page' ORDER BY 'title ASC' ", 'OBJECT');
0
keesiemeijer