Comment trier une fonction « de query_posts » par champ personnalisé, tout en limitant les messages par un autre champ personnalisé

StackOverflow https://stackoverflow.com/questions/4111255

  •  29-09-2019
  •  | 
  •  

Question

Je suis une série de requêtes dans les messages WP avec la fonction suivante:

<?php 
$thirtydays = date('Y/m/d', strtotime('+30 days'));
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts( array( 
    'post_type' => array('post', 'real-estate'), 
    'meta_key' => 'Time          Available', 
    'meta_compare' => '<=', 
    'meta_value' => $thirtydays, 
    'paged' => $paged )); 
?>

Cette partie fonctionne bien. Il est tirant essentiellement tous mes messages Immobilier, mais seulement le retour des résultats qui ont un « temps disponible » de 30 jours ou moins.

Je en ai besoin de commander aussi les messages dans l'ordre croissant de bas en haut en utilisant les données d'un autre champ personnalisé, « Prix. »

Chaque fois que je l'ajoute 'orderby' => 'meta_value', 'meta_key' => 'Price' standard, il ne montre aucun plus de résultats dans les 30 jours.

Est-il possible que je peux combiner ces deux? Et est-il possible d'ajouter un bouton qui ré-exécute la requête et trie par prix, chambres, etc? Ou est-ce trop spécifique pour WP?

Était-ce utile?

La solution

Je crois que cela va vous fournir voulez-vous avoir besoin. Il est une classe appelée PostsOrderedByMetaQuery qui s'étend WP_Query et accepte de nouveaux arguments et 'orderby_meta_key' « orderby_order':

class PostsOrderedByMetaQuery extends WP_Query {
  var $posts_ordered_by_meta = true;
  var $orderby_order = 'ASC';
  var $orderby_meta_key;
  function __construct($args=array()) {
    add_filter('posts_join',array(&$this,'posts_join'),10,2);
    add_filter('posts_orderby',array(&$this,'posts_orderby'),10,2);
    $this->posts_ordered_by_meta = true;
    $this->orderby_meta_key = $args['orderby_meta_key'];
    unset($args['orderby_meta_key']);
    if (!empty($args['orderby_order'])) {
      $this->orderby_order = $args['orderby_order'];
      unset($args['orderby_order']);
    }
    parent::query($args);
  }
  function posts_join($join,$query) {
    if (isset($query->posts_ordered_by_meta)) {
      global $wpdb;
      $join .=<<<SQL
INNER JOIN {$wpdb->postmeta} postmeta_price ON postmeta_price.post_id={$wpdb->posts}.ID
       AND postmeta_price.meta_key='{$this->orderby_meta_key}'
SQL;
    }
    return $join;
  }
  function posts_orderby($orderby,$query) {
    if (isset($query->posts_ordered_by_meta)) {
      global $wpdb;
      $orderby = "postmeta_price.meta_value {$this->orderby_order}";
    }
    return $orderby;
  }
}

vous appelleriez comme ceci:

$thirtydays = date('Y/m/d', strtotime('+30 days'));
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$query = new PostsOrderedByMetaQuery(array(
  'post_type' => array('post', 'real-estate'),
  'meta_key' => 'Time Available',
  'meta_compare' => '<=',
  'meta_value' => $thirtydays,
  'paged' => $paged,
  'orderby_meta_key' => 'Price',
  'orderby_order'    => 'DESC',
));
foreach($query->posts as $post) {
  echo " {$post->post_title}\n";
}

Vous pouvez copier la classe PostsOrderedByMetaQuery au fichier functions.php de votre thème, ou vous pouvez l'utiliser dans un fichier .php d'un plugin peut être écrit.

Si vous voulez tester rapidement que je l'ai posté une version autonome du code Contenu essentiel que vous pouvez télécharger et copier sur votre racine du serveur Web comme test.php, pour modifier votre cas d'utilisation, puis demander à votre navigateur en utilisant une URL comme http://example.com/test.php.

Hope this helps.

-Mike

P.S. Cette réponse est très similaire à une réponse que je viens de donner plus à WordPress réponses , qui est le site de soeur StackOverflow où beaucoup de passionnés WordPress comme moi répondre à des questions par jour. Vous pouvez voir que répondre trop car il a un peu plus d'explications et parce que vous pouvez voir WordPress Réponses . Nous espérons que vous considérerez vos questions sur l'affichage WordPress sur il aussi à l'avenir?

Autres conseils

Parce que 'orderby' => 'meta_value' nécessite meta_key, et votre meta_key est déjà utilisé pour une comparaison, je ne pense pas que vous pouvez le faire. meta_key accepte une seule valeur et non un éventail d'options. Ceci est certainement une limitation et je vous encourage à ouvrir une demande si vous ne trouvez pas une solution.

En ce qui concerne le bouton pour exécuter re-la requête, vous pouvez simplement recharger la page et passer une variable de requête pour changer le genre. Malheureusement, vous avez encore à résoudre la première partie de votre question.

UPDATE

Vous pouvez toujours trier le tableau retourné vous en utilisant PHP.

En outre, pas sûr de ce que vous vérifiez avec le temps disponible mais vous pouvez enregistrer un filtre qui peut vous aider à personnaliser la requête un peu plus add_filter('posts_where', ...); http://codex.wordpress.org/Function_Reference/query_posts

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top