如何从此行代码中排除特定ID?

时间:2016-09-13 作者:Trenton Moore

我使用此代码列出在页面开头有特定字母的页面:

$first_char = \'H\';
        echo \'<table class="alphabet" style="border:0px;border-color:transparent;">
                    <tbody><tr>
                        <td width="100px;" style="border-color:transparent;"><span class="separator-line"></span></td>
                        <td style="border-color:transparent;padding-left:5px;padding-right:5px;"><span class="letter"><strong>\' . $first_char . \'</strong></span></td>
                        <td width="100px;" style="border-color:transparent;"><span class="separator-line"></span></td>
                    </tr>
                </tbody></table>\';
        $postids=$wpdb->get_col($wpdb->prepare("
        SELECT      ID
        FROM        $wpdb->posts
        WHERE       SUBSTR($wpdb->posts.post_title,1,1) = %s
        ORDER BY    $wpdb->posts.post_title",$first_char)); 

        if ($postids) {
        $args=array(
          \'post__in\' => $postids,
          \'post_type\' => \'page\',
          \'post_status\' => \'publish\',
          \'posts_per_page\' => -1,
          \'caller_get_posts\'=> 1.,
        );
        $my_query = null;
        $my_query = new WP_Query($args);
        if( $my_query->have_posts()) {
          while ($my_query->have_posts()) : $my_query->the_post(); ?>
            <p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p>
            <?php
          endwhile;
        }
        wp_reset_query();  // Restore global post data stomped by the_post().
        }
基本上,我需要能够从中排除特定ID。我尝试向$args数组添加一个“exclude”=>“//id”,但没有任何效果。

1 个回复
最合适的回答,由SO网友:bosco 整理而成

另一方面,\'caller_get_posts\' 已在版本3.1中弃用-使用\'ignore_sticky_posts\' 而是使用布尔参数。

\'exclude\' 不是查询参数,因此WordPress会忽略它。使用键通过查询进行后期排除\'post__not_in\' 而是使用单个post ID或ID数组。然而,正如@vancoder指出的那样,该参数会产生计算代价高昂的查询。

同时应用\'post__in\' 参数以及\'post__not_in\' 参数作为一个设置隐式地描述另一个的值。只要您希望同时使用这两种方法,就可以使用一种更简单、更高效的解决方案:只需从\'post__in\' 参数,然后将其应用于查询:

$included_post_ids = $wpdb->get_col( /* ... */ );
$excluded_post_ids = [ /* ids to exclude */ ];

if( !empty( $included_post_ids ) ) {
  $included_post_ids = array_diff( $included_post_ids, $excluded_post_ids );

  $args = [
    \'post__in\'            => $included_post_ids,
    \'post_type\'           => \'page\',
    \'post_status\'         => \'publish\',
    \'posts_per_page\'      => -1,
    \'ignore_sticky_posts\' => true
  ];

  $my_query = new WP_Query( $args );

  // ....
}
有关查询参数的信息,请参阅the WP_Query reference on the Codex.