web-dev-qa-db-fra.com

Comment retourner seulement certains champs en utilisant get_posts ()

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.

4
Wern Ancheta

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 }.

4
s_ha_dum

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).

Liste des arguments disponibles sont:

$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 
);

Exemples d'utilisation

// 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

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

2
Rens Tillmann

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

1
Craig Grella