私は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()
を使ってそれを実行することが本当に不可能であるならば、他にこれを行う方法はありますか?前もって感謝します。
get_posts
は重い作業をWP_Query
に渡し、そのクラスのソースを見ると そのfields
引数を持つオプションの数は限られています だけがあることがわかります。その中には3つのオプションしかありませんswitch
-- ids
、id=>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
クラス自体 のいずれかに返されます。
これを見てください
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テーブルでのみ実行するので分類法とメタクエリは実行できません!
しかし、クエリはすべての投稿フィールドとinclude
、exclude
、search
のようないくつかの '特別な'引数に頼ることができます。
良い部分はこれです:あなたが検索できるフィールドは 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;
}
パラメータfields
には'ids'
または'id=>parent'
しか使用できません。
他のものを解析すると、すべてのフィールドが返されます(これがデフォルトです)。
しかし、Wordpressが2つのオプション'titles'
と'ids_and_titles'
を追加できればいいでしょう。
私はこのパラメータの配列を解析する方法を知りません。私はまた、G.Mによって与えられた答えの限界以来、それは決して起こらないと思います。
より多くの情報: http://codex.wordpress.org/Class_Reference/WP_Query#Return_Fields_Parameter
投稿タイトルをテンプレート内またはプラグイン内に表示したい場合は、次のようにします。
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