özel bir alan anahtarı için tüm değerleri alma (çapraz gönderme)


44

Belirli bir gönderi için özel bir alan değerinin nasıl alınacağını biliyorum.

get_post_meta($post_id, $key, $single);

İhtiyacım olan, tüm mesajlar boyunca belirli bir özel posta anahtarıyla ilişkili tüm değerleri elde etmem .

Bunu yapmanın etkili bir yolunu bilen var mı? DB'deki tüm posta kimlikleri arasında dolaşmak istemem.

Örnek:

4 'Mood' adında özel bir alan için farklı değerlere sahip 4 gönderi. 2 mesajın 'mutlu', 1 mesajın 'kızgın' ve 1 mesajın 'üzücü' değeri var

Çıkmak istiyorum: sahip olduğumuz tüm yayınlarda: iki mutlu, bir öfkeli ve bir üzgün yazar.

Ancak mesajların bir sürü için.

Aradığım şey ya:

  • Bunu almak için bir WP işlevi. veya
  • Bunu olabildiğince verimli bir şekilde almak için özel bir sorgu.

5
Bunu bir taksonomi olarak kullanıyor gibisin. Kaydederken neden bu mesajlara (otomatik olarak) bir terim eklemiyorsunuz? Sorgulamayı çok kolaylaştırır.
kaiser

@kaiser Dahi olduğun için sana yeterince teşekkür edemem!
user2128576

Yanıtlar:


58

Muhtemel bir yaklaşım, WPDB sınıfındaki yardımcı yöntemlerden birinin daha rafine meta tabanlı bir sorgu yapmak için kullanılmasıdır. Bununla birlikte, bu işlevlerden bazılarını kullanmanın uyarısı, genellikle basit bir veri dizisini geri almamanız ve yalnızca bir sütun veya satır çağırıyor olsanız bile, genellikle nesne özelliklerine gereksiz referanslar yapmanız gerekmesidir.

Tabii ki, tüm fonksiyonlar aynı değil ve aynıdır ve sorgulanan verinin basit bir düz dizisini döndüren WPDB yöntemine bilerek yapılan bir işlem söz konusudurget_col ; .

WordPress - WPDB Bir veri sütunu seçme
$ wpdb-> get_col ()

İşte veri tabanını seçilen bir yazı tipi, yazı durumu ve belirli bir meta anahtar (ya da teknik olarak daha az fikirli olan özel bir alan) ile tüm yazı tipleri için sorgulayan bir örnek fonksiyon.

function get_meta_values( $key = '', $type = 'post', $status = 'publish' ) {

    global $wpdb;

    if( empty( $key ) )
        return;

    $r = $wpdb->get_col( $wpdb->prepare( "
        SELECT pm.meta_value FROM {$wpdb->postmeta} pm
        LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
        WHERE pm.meta_key = %s 
        AND p.post_status = %s 
        AND p.post_type = %s
    ", $key, $status, $type ) );

    return $r;
}

Örneğin, hangi yazıların bir derecelendirme anahtarına sahip olduğunu bulmak istiyorsanız , yazı tipi filmler için ve bu bilgiyi değişken içinde saklamak istiyorsanız, böyle bir çağrı örneği olacaktır.

$movie_ratings = get_meta_values( 'rating', 'movies' );

Bu verileri ekrana yazdırmaktan başka bir şey yapmak istemiyorsanız, PHP'nin implode işlevi bu basit diziyi hızlı bir şekilde veri satırlarına ekleyebilir.

// Print the meta values seperate by a line break
echo implode( '<br />', get_meta_values( 'YOURKEY' ));

Döndürülen veriler üzerinde basit bir döngü yaparak ve sayımların bir dizisini oluşturarak, bu meta değerlerinin kaç yazının olduğunu bulmak için döndürülen verileri de kullanabilirsiniz.

$movie_ratings = get_meta_values( 'rating', 'movies' );
if( !empty( $movie_ratings ) ) {
    $num_of_ratings = array();
    foreach( $movie_ratings as $meta_value )
        $num_of_ratings[$meta_value] = ( isset( $num_of_ratings[$meta_value] ) ) ? $num_of_ratings[$meta_value] + 1 : 1;
}

/*
Result:
Array(
    [5] => 10
    [9] => 2
)
// ie. there are 10 movie posts with a rating of 5 and 2 movie posts with a rating of 9.
*/

Bu mantık, çeşitli verilere uygulanabilir ve birçok farklı şekilde çalışmak üzere genişletilebilir. Bu yüzden, örneklerimin izleyebilecek kadar basit ve basit olduğunu umuyorum.


3
Ayrıca gelecekteki izleyiciler için eğlence olgusu, sadece Benzersiz meta değerleri çekmek istiyorsanız, yukarıdaki işlevden DISTINCThemen sonra yazabilirsiniz SELECT. Yararlı olabilir.
Howdy_McGee

Bu son derece yararlı olduğunu düşünüyorum
Pablo SG Pacheco

Bunu nasıl yapılır ve sıralanan değerleri döndürürüm.,
SİPARİŞ'i

14

Sadece yukarıdaki t31os'un koduna küçük bir şey eklemek istiyorum . Bu kodu kendim kullandığımda tekrarlanan girişleri ortadan kaldırmak için "SELECT" i "SELECT DISTINCT" olarak değiştirdim.


1
Aynı değerde birden fazla meta değere sahip olmanın geçerli olduğu durumları hayal edebiliyorum ve bu yüzden koduma bu ekleme yapmadı. Farklı değerler istiyorsanız, bu olsa gitmek için yol olurdu. Ek olarak, bunu işlev için bir argüman olarak da ekleyebilirsiniz (böylece uygun şekilde kullanabilirsiniz veya kullanabilirsiniz).
t31os

10

Global $ wpdb kullanmak iyi değil ya da gerekli değil:

// function to grab all possible meta values of the chosen meta key.
function get_meta_values( $meta_key,  $post_type = 'post' ) {

    $posts = get_posts(
        array(
            'post_type' => $post_type,
            'meta_key' => $meta_key,
            'posts_per_page' => -1,
        )
    );

    $meta_values = array();
    foreach( $posts as $post ) {
        $meta_values[] = get_post_meta( $post->ID, $meta_key, true );
    }

    return $meta_values;

}

$meta_values = get_meta_values( $meta_key, $post_type );

Bu, çoğu durumda benim tercih ettiğim yöntemdir. Sadece bir taneden ziyade beş sorgu yapar, ancak bunları oluşturmak ve göndermek için standart WordPress prosedürlerini kullandığından, platforma özel herhangi bir önbellekleme (WP Motor'un Nesne Önbelleği veya rastgele bir eklenti gibi) devreye girecektir. istek süresince WordPress'in dahili önbelleğinde saklanabilir, bu nedenle gerekirse veritabanından tekrar alınması gerekmez.
Andrew Dinmore

Herhangi bir filtre, örneğin çok dilli bir sitede çok önemli olabilecek verilere de uygulanacaktır. Son olarak, yalnızca standart WordPress çekirdek işlevlerini kullandığından, gelecekteki bir güncellemenin kırılma olasılığı çok daha düşüktür.
Andrew Dinmore

4

en hızlı yol özel bir sql sorgusu olurdu ve emin değilim ama deneyebilirsiniz

$wpdb->get_results("
  SELECT posts.* , COUNT(*) 'moodcount'
  FROM $wpdb->posts as posts
  JOIN $wpdb->postmeta as postmeta
  ON postmeta.post_id = posts.ID
  AND postmeta.meta_key = 'Mood'
  GROUP BY postmeta.meta_key
");

Bir şey varsa o zaman bir başlangıç.


1
teşekkürler, ancak “ne pahasına olursa olsun” özel sorgulardan kaçınılmamalıdır mı? WP soyutlama katmanını kullanmayı tercih ederim (buna ne denir?) ... ama elbette bu mümkün değilse ..
mikkelbreum

Özel sorgular, doğru yolla yazılmışsa, daha iyi olabilir ve ne yaptığınızı bilmiyorsanız yalnızca bunlardan kaçınmalısınız.
Bainternet

1
Ben çok yararlı ve pratik MWB .Özel sorgu ile Anlaştı ama özellikle .. SRT işlevlerini kullanarak .. onlar da DB üzerinde çok ağır olduğunu düşünüyorum
krembo99

3

Tüm meta değerlerini bir meta anahtarla almak için

Wp-> db wordpress kodeksini kontrol edin

$values = $wpdb->get_col("SELECT meta_value
    FROM $wpdb->postmeta WHERE meta_key = 'yourmetakey'" );

3
Bu yaklaşımla ilgili sorun, özgünlük eksikliğidir; bu tür bir sorgudan taslakları, çöpe atılmış öğeleri, yayınları, sayfaları ve var olan diğer yazı türlerini içerebilecek çok sayıda sonuç alırsınız. İhtiyacınız olmayan şeyleri asla sorgulamamalısınız, burada kesinlikle özgüllük gereklidir.
t31os

Diğer yazı tiplerinden ve durumlardan değer alabileceğiniz doğru olsa da, tek ihtiyacınız olan değerlerin olduğu ve bu meta_key'i istediğiniz yerde kullanmadığınız ancak ihtiyaç duyduğunuz zamanlar olabilir. Tüm / çoğu değerler benzersizse, bu en iyi çözüm olabilir.
Luke Gedeon

2

T31os ve Bainternet kodunu, sayımı ve değerleri tek bir etkin işlemle döndüren, yeniden kullanılabilir bir hazır ifade (wordpress stili) elde etmek için birleştiremezsiniz.

Bu özel bir sorgu ama yine de wordpress veritabanı soyutlama katmanını kullanıyor - bu nedenle örneğin tablo adlarının gerçekte ne olduğu veya değişip değişmediği önemli değil ve hazırlanmış bir ifadedir, bu yüzden SQL saldırılarından çok daha güvenliyiz vb. .

Bu durumda artık yazı türünü kontrol etmiyorum ve boş dizeleri hariç tutuyorum:

    $r = $wpdb->get_results(  $wpdb->prepare( "
        SELECT pm.meta_value AS name, count(*) AS count  FROM {$wpdb->postmeta} pm
        LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
        WHERE pm.meta_key = '%s'
        AND pm.meta_value != '' 
        AND p.post_type = '%s'
        GROUP BY pm.meta_value
        ORDER BY pm.meta_value          
        ", $key, $type) 
        );
    return $r;

Bu özelde

Bu, şöyle bir nesne dizisini döndürür:

array  
 0 => 
 object(stdClass)[359]
  public 'name' => string 'Hamish' (length=6)
  public 'count' => string '3' (length=1)
 1 => 
 object(stdClass)[360]
  public 'name' => string 'Ida' (length=11)
  public 'count' => string '1' (length=1)
 2 => 
 object(stdClass)[361]
  public 'name' => string 'John' (length=12)
  public 'count' => string '1' (length=1)

0

Foreach ile aşağıdakileri kullanın

 $key = get_post_custom_values( 'key' );

Özel alan anahtarınızın adını


Bir post_id belirtilmediğinde, bunun varsayılan gönderinin varsayılanı olduğuna dikkat edin.
birgire
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.