按第一个字母过滤我的参数

时间:2013-06-21 作者:user34406

我筛选我的WP_Query 通过此脚本:

$args = array (
        \'posts_per_page\' => $posts_per_page,
        \'post_type\' => $post_type,
        \'meta_key\' => \'post_views_count\',
        \'orderby\' => \'meta_value_num\',
        \'showposts\' => 160,
        \'order\' => \'DESC\',
        \'paged\' => $paged,
            \'tax_query\' => array(
               array(
                   \'taxonomy\' => $term->taxonomy,
                   \'field\' => \'slug\',
                   \'terms\' => $term->name)));
我想添加过滤器SUBSTRING(post_title, 1,1) =\'z\'.<这有可能实现吗<只循环以字母X开头的帖子的最佳做法是什么?

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

仅限于字母X 从动态角度来看,以下各项应该可以工作。这取决于以下事实:WP_Query 将允许特殊参数通过。您可以将自己的数据发送到过滤器。我不知道这是否是故意的行为,所以请注意,但这是非常有用的行为。

只需通过substring_where 参数并让过滤器工作。有两个版本,一个使用SUBSTRING 就像你想做的那样LIKE. 我不知道哪一个更快,尽管它们看起来很接近。

我还使用$wpdb->prepare 但这可能没有必要。这取决于数据的来源。

$args = array (
  \'post_type\' => \'post\',
  \'ignore_sticky_posts\' => true,
  \'substring_where\' => \'t\',
);

function restrict_by_first_letter( $where, $qry ) {
  global $wpdb;
  $sub = $qry->get(\'substring_where\');
  if (!empty($sub)) {
    $where .= $wpdb->prepare(
      " AND SUBSTRING( {$wpdb->posts}.post_title, 1, 1 ) = %s ",
      $sub
    );

//  $where .= $wpdb->prepare(
//    " AND {$wpdb->posts}.post_title LIKE %s ",
//    $sub.\'%\'
//  );
  }
  return $where;
}
add_filter( \'posts_where\' , \'restrict_by_first_letter\', 1 , 2 );

$results = new WP_Query( $args );

var_dump($results->request); // debug
var_dump(wp_list_pluck($results->posts,\'post_title\')); // debug

SO网友:birgire

您可以使用posts_where 用于调整的过滤器WHERE 部分查询:

add_filter( \'posts_where\' , \'custom_posts_where\' );
$results = new WP_Query( $args );
remove_filter( \'posts_where\' , \'custom_posts_where\' );

function custom_posts_where( $where ){
    $where .= " AND SUBSTRING( post_title, 1, 1 ) =\'z\' ";
    return $where;
}

结束

相关推荐

Apply_Filters()和_Excerpt提供了意外的结果

我觉得我一定错过了一些显而易见的东西,但我似乎无法让WordPress合作。我正在用一个函数生成Facebook OG标签。除了摘录,一切都很好。自get_the_excerpt($post->ID), 有没有其他方法可以创建摘录而不必创建一个全新的循环?我觉得这太过分了。我的第一反应是apply_filters():$description = apply_filters(\'the_excerpt\', get_post($post->ID)->post_content);