it-swarm-eu.dev

získání všech hodnot pro vlastní klíč pole (křížový příspěvek)

Vím, jak získat vlastní hodnotu pole pro konkrétní příspěvek.

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

Potřebuji získat všechny hodnoty spojené se specifickým uživatelským klíčem příspěvku, napříč všemi příspěvky .

Každý, kdo ví o účinném způsobu, jak to udělat? Já bych nechtěl smyčku přes všechny post id je v DB.

Příklad:

4 příspěvky všechny s různými hodnotami pro vlastní pole nazvané 'Nálada'. 2 příspěvky mají hodnotu „happy“, 1 příspěvek má „naštvaný“ a 1 příspěvek má „smutný“

Chci výstup: napříč všemi příspěvky máme: dva šťastné, jeden rozzlobený a jeden smutný autor (y).

Ale pro mnoho příspěvků.

Hledám buď:

  • a WP funkce. nebo
  • vlastní dotaz, aby to co nejefektivněji.
40
mikkelbreum

Jedním z možných přístupů by bylo použití jedné z pomocných metod ve třídě WPDB k provedení podrobnějšího dotazu založeného na meta. Upozornění na použití některých z těchto funkcí však spočívá v tom, že se obvykle nevrátíte k jednoduchému poli dat a obvykle budete potřebovat zbytečné odkazy na vlastnosti objektů, a to i v případě, že voláte pouze pro jeden sloupec nebo řádek.

Samozřejmě, že ne všechny funkce jsou jedna a ta samá, a účelná zmínka vychází z metodyWPDBmethod, get_col, která vrací jednoduché ploché pole dat dotazovaných, a to konkrétně uvádím. protože následující příklad bude volat tuto metodu.

WordPress - WPDB Výběr sloupce dat
$ wpdb-> get_col ()

Zde je příklad funkce, která dotazuje databázi pro všechny příspěvky zvoleného typu příspěvku, stav příspěvku a specifický meta klíč (nebo vlastní pole pro méně technicky smýšlející).

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

Pokud například chcete zjistit, které příspěvky mají meta klíčhodnocení, pro typ příspěvkufilmya vy Chcete-li tyto informace uložit do proměnné, příkladem takového volání by bylo ..

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

Pokud jste chtěli udělat nic víc než tisknout data na obrazovku, implicitní funkce PHP může rychle spojit toto jednoduché pole do řádků dat.

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

Můžete také použít vrácená data, abyste zjistili, kolik příspěvků má tyto meta hodnoty provedením jednoduché smyčky nad vrácenými daty a například vytvořením pole počitků.

$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.
*/

Tato logika by mohla být aplikována na různé druhy dat a rozšířena na práci mnoha různými způsoby. Takže doufám, že moje příklady byly užitečné a dost jednoduché na to, aby je následovaly.

56
t31os

Chtěl bych přidat jednu malou věc do t31os výše uvedeného kódu. Změnil jsem "SELECT" na "SELECT DISTINCT", aby se odstranily duplicitní položky, když jsem použil tento kód sám.

14
Lehooo

Není vhodné nebo nutné použít globální $ wpdb:

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

nejrychlejší způsob by byl vlastní SQL dotaz a nejsem si jistý, ale můžete to zkusit

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

Pokud něco takového je to začátek.

4
Bainternet

Pro získání všech meta hodnot meta klíčem

Kontrola wp-> db wordpress codex

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

Neexistuje žádný důvod, proč nemůžete sloučit kód t31os a Bainternet, aby měl znovu použitelný připravený příkaz (styl wordpress), který vrátí počet a hodnoty v jedné efektivní operaci.

Jedná se o vlastní dotaz, ale stále používá vrstvu abstrakce databáze wordpress - takže například nezáleží na tom, jaké jsou názvy tabulek, nebo zda se mění, a je to připravené prohlášení, takže jsme mnohem bezpečnější z útoků SQL atd. .

V tomto případě už nekontroluji typ příspěvku a vylučuji prázdné řetězce:

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

V tomto konkrétním případě

Tím se vrátí pole objektů jako je tato:

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)
2
benz001

Použijte následující s foreach

 $key = get_post_custom_values( 'key' );

Předpokládá se, že pojmenovaný klíč vlastního pole je

0
Dev