J'essaie d'obtenir uniquement les champs dont j'ai besoin à l'aide de la fonction get_posts()
dans WordPress. J'ai actuellement le code suivant:
$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);
Cela fonctionne bien si je veux seulement obtenir l'identifiant. Mais si je veux obtenir le permalien ou le titre du message avec les identifiants, je ne suis pas sûr de savoir quoi faire. J'ai déjà essayé ce qui suit:
'fields' => array('ids', 'post_titles')
'fields' => 'ids,post_titles'
'fields' => 'ids,titles'
'fields' => array('ids','titles')
Mais rien ne fonctionne, je suppose que le seul domaine reconnu est le champ ids
. Y a-t-il un autre moyen de faire cela si ce n'est vraiment pas possible de le faire en utilisant get_posts()
? Merci d'avance.
get_posts
TRANSFÈRE LE POIDS LOURD À WP_Query
et si vous regardez le source de cette classe, vous pouvez voir qu'il n'y a qu'un nombre limité d'options avec cet argument fields
. Il n'y a que trois options dans switch
-- ids
, id=>parent
et le cas par défaut, le tout.
Vous pouvez utiliser le filtre posts_fields
pour modifier les champs renvoyés, bien que il semble que vous deviez passer 'suppress_filters => false
dans les arguments pour que ce filtre soit exécuté . Ça devrait ressembler a quelque chose comme ca:
function alter_fields_wpse_108288($fields) {
return 'ID,post_title'; // etc
}
add_filter('posts_fields','alter_fields_wpse_10888');
Cependant, le problème est plus vaste. Les objets de publication qui sont renvoyés sont créés par un appel à get_post
_ et il ne respecte pas les valeurs transmises à la requête d'origine et je ne vois pas le moyen de changer ce qui est obtenu. retourné soit dans get_posts
, soit dans la WP_Post
même }.
Regarde ça
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);
}
C'est une fonction qui imite get_posts mais avec la possibilité d'obtenir les champs que vous désirez. Attention, cette fonction est not get_posts et a 2 grandes limitations: ne s’exécute que dans la table posts, la taxonomie et la méta-requête ne peuvent donc pas être exécutées!
Toutefois, la requête peut s’appuyer sur tous les champs de publication et sur certains arguments "spéciaux" tels que include
, exclude
et search
.
La bonne partie est la suivante: les champs que vous pouvez récupérer sont tous le champ de la table post. Passez simplement une liste ou un tableau dans l'argument fields
. Bonus: en passant un seul champ est retourné un tableau à une dimension de chaînes ou d'entiers (au lieu d'un tableau d'objets).
$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;
}
Vous pouvez uniquement utiliser 'ids'
ou 'id=>parent'
pour le paramètre fields
.
Si vous analysez quelque chose d'autre, tous les champs seront retournés (c'est la valeur par défaut).
Cependant, ce serait bien si Wordpress pouvait ajouter les 2 options suivantes: 'titles'
et 'ids_and_titles'
.
Je ne suis pas au courant d'un moyen d'analyser un tableau pour ce paramètre. Je pense aussi que cela n'arrivera jamais, étant donné les limites de la réponse donnée par G. M.
Plus d'infos: http://codex.wordpress.org/Class_Reference/WP_Query#Return_Fields_Parameter
Si vous souhaitez afficher le titre de l'article dans un modèle ou dans un plugin, vous pouvez utiliser:
get_the_title($ID)
Voir référence wordpress: http://codex.wordpress.org/Function_Reference/get_the_title
Si vous l'utilisez en dehors de la boucle, l'ID $ est requis. Quoi qu'il en soit, il sera probablement utilisé comme ceci:
Vous pouvez aussi utiliser:
the_permalink () - pour récupérer une publication permalink the_title () - pour récupérer une publication
Ce sont toutes les balises de template wordpress. Une liste complète des balises de modèles que vous pouvez utiliser se trouve ici: http://codex.wordpress.org/Template_Tags