web-dev-qa-db-ja.com

Get_posts()を使って特定のフィールドだけを返す方法

私はWordPressのget_posts()関数を使うのに必要なフィールドだけを取得しようとしています。私は現在以下のコードを持っています:

    $posts_args = array(
        'orderby' => 'post_date',
        'order' => 'DESC',
        'post_type' => 'post',
        'post_status' => 'publish',
        'posts_per_page' => 5,
        'fields' => 'ids'
    );

    $post_ids_r = get_posts($posts_args);

私がIDを取得したいだけなら、これはうまく機能します。しかし、パーマリンクや記事のタイトルをIDと一緒に取得したいのであれば、どうすればいいのかわかりません。私はすでに次のことを試みました:

'fields' => array('ids', 'post_titles')
'fields' => 'ids,post_titles'
'fields' => 'ids,titles'
'fields' => array('ids','titles')

しかし、何もうまくいきません。私が認識している唯一のものはidsフィールドです。 get_posts()を使ってそれを実行することが本当に不可能であるならば、他にこれを行う方法はありますか?前もって感謝します。

4
Wern Ancheta

get_postsは重い作業をWP_Query に渡し、そのクラスのソースを見ると そのfields引数を持つオプションの数は限られています だけがあることがわかります。その中には3つのオプションしかありませんswitch-- idsid=>parent、そしてデフォルトのケース、すべてです。

posts_fieldsフィルタを使用して、返されるフィールドを変更することができますが、 そのフィルタを実行するには'suppress_filters => falseを引数に渡す必要があるようです です。これは次のようになります。

function alter_fields_wpse_108288($fields) {
  return 'ID,post_title'; // etc
}
add_filter('posts_fields','alter_fields_wpse_10888');

しかし、もっと大きな問題があります。返される投稿オブジェクトは、 get_post および 元のクエリに渡された値を受け入れない の呼び出しによって作成され、取得する内容を変更する方法はわかりません。 get_postsまたは WP_Postクラス自体 のいずれかに返されます。

4
s_ha_dum

これを見てください

function get_posts_fields( $args = array() ) {
  $valid_fields = array(
    'ID'=>'%d', 'post_author'=>'%d',
    'post_type'=>'%s', 'post_mime_type'=>'%s',
    'post_title'=>false, 'post_name'=>'%s', 
    'post_date'=>'%s', 'post_modified'=>'%s',
    'menu_order'=>'%d', 'post_parent'=>'%d', 
    'post_excerpt'=>false, 'post_content'=>false,
    'post_status'=>'%s', 'comment_status'=>false, 'ping_status'=>false,
    'to_ping'=>false, 'pinged'=>false, 'comment_count'=>'%d'
  );
  $defaults = array(
    'post_type' => 'post',
    'post_status' => 'publish',
    'orderby' => 'post_date',
    'order' => 'DESC',
    'posts_per_page' => get_option('posts_per_page'),
  );
  global $wpdb;
  $args = wp_parse_args($args, $defaults);
  $where = "";
  foreach ( $valid_fields as $field => $can_query ) {
    if ( isset($args[$field]) && $can_query ) {
      if ( $where != "" )  $where .= " AND ";
      $where .= $wpdb->prepare( $field . " = " . $can_query, $args[$field] );
    }
  }
  if ( isset($args['search']) && is_string($args['search']) ) {
      if ( $where != "" )  $where .= " AND ";
      $where .= $wpdb->prepare("post_title LIKE %s", "%" . $args['search'] . "%");
  }
  if ( isset($args['include']) ) {
     if ( is_string($args['include']) ) $args['include'] = explode(',', $args['include']); 
     if ( is_array($args['include']) ) {
      $args['include'] = array_map('intval', $args['include']); 
      if ( $where != "" )  $where .= " OR ";
      $where .= "ID IN (" . implode(',', $args['include'] ). ")";
    }
  }
  if ( isset($args['exclude']) ) {
     if ( is_string($args['exclude']) ) $args['exclude'] = explode(',', $args['exclude']); 
     if ( is_array($args['exclude']) ) {
      $args['exclude'] = array_map('intval', $args['exclude']);
      if ( $where != "" ) $where .= " AND "; 
      $where .= "ID NOT IN (" . implode(',', $args['exclude'] ). ")";
    }
  }
  extract($args);
  $iscol = false;
  if ( isset($fields) ) { 
    if ( is_string($fields) ) $fields = explode(',', $fields);
    if ( is_array($fields) ) {
      $fields = array_intersect($fields, array_keys($valid_fields)); 
      if( count($fields) == 1 ) $iscol = true;
      $fields = implode(',', $fields);
    }
  }
  if ( empty($fields) ) $fields = '*';
  if ( ! in_array($orderby, $valid_fields) ) $orderby = 'post_date';
  if ( ! in_array( strtoupper($order), array('ASC','DESC')) ) $order = 'DESC';
  if ( ! intval($posts_per_page) && $posts_per_page != -1)
     $posts_per_page = $defaults['posts_per_page'];
  if ( $where == "" ) $where = "1";
  $q = "SELECT $fields FROM $wpdb->posts WHERE " . $where;
  $q .= " ORDER BY $orderby $order";
  if ( $posts_per_page != -1) $q .= " LIMIT $posts_per_page";
  return $iscol ? $wpdb->get_col($q) : $wpdb->get_results($q);
}

それは mimics get_postsという関数ですが、あなたが望むフィールドを取得することができます。注意:この関数は not get_postsであり、2つの大きな制限があります:postsテーブルでのみ実行するので分類法とメタクエリは実行できません!

しかし、クエリはすべての投稿フィールドとincludeexcludesearchのようないくつかの '特別な'引数に頼ることができます。

良い部分はこれです:あなたが検索できるフィールドは all postテーブルのフィールドです。リストまたは配列をfields引数に渡すだけです。おまけ:1つのフィールドだけを渡すと、(オブジェクトの配列ではなく)文字列または整数の1次元配列が返されます。

利用可能な引数のリストは以下のとおりです。

$available_args = array(
  'ID', // int
  'post_author', // string
  'post_type', // string
  'post_mime_type', // string
  'post_name', // string
  'post_date', // string
  'post_modified', // string
  'menu_order', // int
  'post_parent', // int 
  'post_status', // string
  'comment_status', // string
  'comment_count', // int 
  'orderby', // string, a valid field name
  'order', // string 'ASC', or 'DESC',
  'posts_per_page', // int
  'include', // array (or comma separed string) of post ids
  'exclude', // array (or comma separed string) of post ids
  'search', // string if passed will search for it in post title
  'fields', // array (or comma separed string) of fields to retrieve.
            // If only 1 field is passed a 'flat' array is returned 
);

使用例

// Retrieve the date and the title of pages having 'Hello' in the title
$pages_hello = get_posts_fields("post_type=page&search=Hello&fields=post_date,post_title");


// another example
$args = array(
  'post_type' => 'custom_post',
  'posts_per_page' => -1,
  'post_parent' => 1,
  'include' => array(2,3,4),
  'exclude' => '6,8,10',
  'fields' => array('post_title', 'comment_status')
);
get_posts_fields($args);


// One more, just for fun ;)
$args = array(
  'post_type' => 'attachment', 'posts_per_page' => -1,
  'post_status' => 'inherit', 'fields' => 'post_mime_type'
);
foreach ( array_count_values ( get_posts_fields($args) ) as $mime => $count ) {
  echo "I have $count media of the type $mime" . PHP_EOL;
}
3
gmazzap

パラメータfieldsには'ids'または'id=>parent'しか使用できません。

他のものを解析すると、すべてのフィールドが返されます(これがデフォルトです)。

しかし、Wordpressが2つのオプション'titles''ids_and_titles'を追加できればいいでしょう。

私はこのパラメータの配列を解析する方法を知りません。私はまた、G.Mによって与えられた答えの限界以来、それは決して起こらないと思います。

より多くの情報: http://codex.wordpress.org/Class_Reference/WP_Query#Return_Fields_Parameter

2
Rens Tillmann

投稿タイトルをテンプレート内またはプラグイン内に表示したい場合は、次のようにします。

get_the_title($ID)

Wordpressのリファレンスを参照してください: http://codex.wordpress.org/Function_Reference/get_the_title

ループ外で使用している場合は、$ IDが必要です。どちらにしても、おそらくこのように使用されます。

また使用することができます:

the_permalink() - 投稿の固定リンクを取得するthe_title() - 投稿のタイトルを取得

これらはすべてワードプレスのテンプレートタグです。あなたが使用できるテンプレートタグの完全なリストはここにあります: http://codex.wordpress.org/Template_Tags

1
Craig Grella