Özel alanın orderby meta_value ile özel sorgu


36

Bildiğiniz gibi, WP3.0'dan itibaren, özel, gelişmiş sorgular için harika seçenekler var. Bundan dolayı, yeni meta_query parametresi için meta_key, meta_value gibi özel alanların bazı sorgu parametreleri kullanımdan kaldırılmıştır ( buraya bakın )

Yeni sözdizimi ile oldukça basit bir sorgu almaya çalışıyorum, belirli bir meta_key (order_in_archive) içeren belirli bir post_type (services) sorgusu gönderiyorum - bu beklendiği gibi gidiyor. Ancak - sorguyu meta_değerine göre sıralamak ve başarılı olmak istemiyorum.

Bu benim sorgum -

   query_posts(
    array(  'post_type' => 'services',
        'order' => 'ASC',
        'orderby' => 'meta_value',
        'meta_query' => array(
            array('key' => 'order_in_archive'))
    )
);

Aynı zamanda meta_value_numeric ve meta_value tarafından da sipariş vermeye çalıştım, ancak her durumda sonuçlar yayınlanma tarihine göre sıralanıyor (normal yayınlarda olduğu gibi). Bunun nasıl yapılabileceğini bilen var mı?

Teşekkürler

Yanıtlar:


35

Eski yöntemi kullanarak sipariş parametresi için meta anahtarı tanımlayabilirsiniz (WP 3.1.1'de test ettim) ...

query_posts(
    array(  'post_type' => 'services',
            'order'     => 'ASC',
            'meta_key' => 'some_key',
            'orderby'   => 'meta_value', //or 'meta_value_num'
            'meta_query' => array(
                                array('key' => 'order_in_archive',
                                      'value' => 'some_value'
                                )
                            )
    )
);

15

Genel olarak bu sorun, WordPress 4.2'de adlandırılmış sorgular kullanılarak giderilmiştir . Örneğin

$args = array(
  'post_type' => 'services',
  'orderby'   => 'order_clause',
  'meta_query' => array(
       'order_clause' => array(
            'key' => 'order_in_archive',
            'value' => 'some_value',
            'type' => 'NUMERIC' // unless the field is not a number
)));

Benim için sayısal bir alana göre sıralamak istedim 'type' => 'NUMERIC've meta sorgu içinde kullanmak zorunda kaldım .


1
Adlandırılmış sorgularda Başar bul!
Kaji

Evet, adlandırılmış sorgular da benim için soruyu yanıtladı.
Dalton,

Mükemmel. Bu order_clause'da 'değerin' öneminden emin değilim, çünkü bunu 'order_in_archive' en yüksek-en düşük değere göre sıralaması gerekmiyor.
Andrew Schultz

10

WP Kodeksi bu sorunu çözerken aslında kafa karıştırıcıdır.

Siparişi kullanmak için aslında meta_query paramına ihtiyacınız yoktur, bunun yerine WP Codex tarafından burada kullanım dışı bırakılmış olmasına rağmen burada meta_key paramunu kullanır: Wordpress 3.1'de meta_query ile orderby'i nasıl kullanıyorsunuz? bu siparişin hala meta_key'e ihtiyacı var.

bu yüzden olmalı

query_posts( array(
  'post_type' => 'services',
  'order' => 'ASC',
  'orderby' => 'meta_value',
  'meta_key' => 'order_in_archive'
) )

2
Evet, bu, bu sorguyu yapmak için kullanılan eski yöntem ve bu belirtilen için çalışıyor gibi görünüyor. Neyse, daha karmaşık sorgular için işe yaramaz. Bu, halledilmesi gereken bilinen bir sorun olduğunu, detayları # 15031 ve # 17065
Maor Barazany'de

2

Bu kolay:

İşte kodum:

query_posts(array( 
        'post_type' => 'directors',
        'posts_per_page' => -1,
        'order'    => 'ASC',
        'orderby'  => 'director_weight',
        'meta_key' => 'director_weight'
) );

Ana ayrıntı: dahil etme meta_key, kodum meta_keydahil edilmediği sürece sipariş vermedi ve hepsi bu:

İşte bir directorsresim listesinin tam kodu director_weight:

<?php 
    query_posts(array( 
        'post_type' => 'directors',
        'posts_per_page' => -1,
        'order'    => 'ASC',
        'orderby'  => 'director_weight',
        'meta_key' => 'director_weight'
    ) );
    while (have_posts()) : the_post();
?>  
    <li <?php echo get_field('director_weight') ?>>
        <img src="<?php echo get_field('director_imagen') ?>">
    </li>
<?php
    endwhile;
    wp_reset_query();
?>

order_by özel alan wordpress


1

Query_posts kullanmayın .

$meta_query = new WP_Meta_Query( $meta_query_args );

$meta_query_args = array(
   'post_type' => 'services',
    'order'     => 'ASC',
    'meta_key' => 'your_key',
    'orderby'   => 'meta_value', //or 'meta_value_num'
    'meta_query' => array(
                    array('key' => 'order_in_archive',
                        'value' => 'some_value'
)));

WP_Meta_Query parametrelerini kullanın


0

Bunu oldukça iyi çalıştığını buldum.

<?php 
query_posts(
array(  'posts_per_page' => '-1',
        'post_type' => 'services',
        'order'     => 'DESC',
        'meta_key' => '_order',
        'orderby'   => 'meta_value_num', //or 'meta_value_num'
      )
);

3
Soru, new-ish meta_queryparametresi ve orderbyonunla çalışmaya başlamakla ilgili, eski ama hala işlevsel meta_key/ meta_valueparametreler ile ilgili değil. Ayrıca, kullanımını teşvik etmeyelim query_posts.
s_ha_dum

Bu cevap birden fazla hatalı uygulama içeriyor: -1 kullanarak, onu string olarak geçirmek, query_posts kullanarak Kaldırılması gerekir.
Ihor Vorotnov

0

Azalan tarihe göre sıralamak için ihtiyaç duyduğum bir dizi özel etkinlik tarihim vardı. Özel etkinlik tarihim wp_postmeta tablomda depolandığından ve tipik olarak post_date veya değiştirilmiş tarihlerden farklı olduğundan, bu benim için çalıştı:

  $args = array(
    'post_type' => 'events', // my post type - yours can be 'posts'
    'post_status' => 'publish', // only get posts with this status
    'orderby' => 'meta_value', // orderby the meta_value of the following meta_key
    'meta_key' => 'my_custom_eventdate', // the custom meta_key name
    'order'=> 'DESC' // sort descending
  );

  $posts = new WP_Query($args);

Daha sonra şöyle $ gönderiler arasında döngü yapabilirsiniz:

foreach($posts->posts as $p){

    $post_id = $p->ID;
    // and so on ...

    // # example of how I retrieve my event date
    $event = get_post_meta($post_id, 'my_custom_eventdate', true);
}

0

Bu benim için çalışıyor

    $args = array(
        'post_type' => 'services',
        'order' => 'ASC',
        'orderby'   => 'order_clause',   
        'meta_query' => array(
        'order_clause' => array(
        'key' => 'order_in_archive'
    )));

Yalnızca order_clause için anahtar sağlamak için gerekli

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.