SELECT max(meta_value) FROM wp_postmeta WHERE meta_key='price'... încetează să funcționeze când valoarea depășește 999

11 iun. 2012, 08:19:02
Vizualizări: 14.7K
Voturi: 6

Prezentare generală: Nu încerc să returnez un post. Vreau doar cea mai mare valoare pentru un anumit meta_value din toate posturile... doar valoarea în sine.

Detalii: Am adăugat un meta_key personalizat "price" la toate postările mele. Valoarea este întotdeauna un număr întreg (fără zecimale sau caractere non-numerice). Încerc să fac o interogare care să returneze cea mai mare valoare meta_value asociată cu acest meta_key.

Cod problematic

function max_meta_value(){
    global $wpdb;
    $query = "SELECT max(meta_value) FROM wp_postmeta WHERE meta_key='price'";
    $the_max = $wpdb->get_var($query);
    return $the_max;
}

Rezultate eronate: Inițial am crezut că codul de mai sus funcționează, pentru că o face dacă toate meta_value sunt mai mici de 999. Am descoperit ulterior că dacă meta_value este mai mare de 999, atunci este ignorat. Deci, de fapt, codul de mai sus îmi dă max(meta_value) doar pentru valori mai mici de 1000.

Apel la comunitate: Evident, nu știu de ce eșuează, dar am senzația că are legătură cu modul în care WP stochează valoarea - poate este legat de tipul de date? Sau poate nu ar trebui să folosesc $wpdb->get_var(). Orice îndrumare va fi apreciată.

0
Toate răspunsurile la întrebare 4
1
16

Valoarea meta_value nu este de tip întreg pentru ca funcția max să returneze valori corecte. Puteți folosi metoda cast din MySQL pentru a converti în numere întregi, după cum urmează:

SELECT max(cast(meta_value as unsigned)) FROM wp_postmeta WHERE meta_key='price'

11 iun. 2012 08:51:28
Comentarii

Includ doar postări publicate: http://pastebin.com/pR6SDEdf

emc emc
16 mai 2013 02:24:50
1

Am modificat funcția originală și soluția KDM pentru a avea o funcție mai universală. Iată cum arată:

function end_meta_value( $end = "max", $meta )
{
    global $wpdb;
    $query = $wpdb->prepare( 
        "SELECT %s( cast( meta_value as UNSIGNED ) ) FROM {$wpdb->postmeta} WHERE meta_key='%s'",
        $end,
        $meta
    );
    return $wpdb->get_var( $query );
}

În acest fel poți obține atât valorile minime cât și maxime ale oricărui meta_value personalizat. De asemenea, am schimbat wp_postmeta în $wpdb->postmeta pentru a se potrivi cu orice prefix folosit.

Notă: Dacă dorești să interoghezi o cifră, înlocuiește %s în instrucțiunea $wpdb->prepare() cu %d.

21 mai 2013 03:05:10
Comentarii

Mulțumesc pentru răspuns. Am primit o eroare de sintaxă SQL. Problema este că wpdb->prepare încadrează variabila $end între ghilimele simple '', așa că interogarea devine SELECT 'max'(cast... ceea ce generează o eroare. Puteți concatena astfel: $sql = "SELECT " . $end . "(cast...". Așa a funcționat pentru mine.

Laxmana Laxmana
6 mai 2014 17:29:05
0

Am modificat soluția lui szajmon pentru a funcționa cu wp_cache și pentru a repara eroarea de sintaxă SQL pe care o primesc.

wpdb->prepare încadrează variabila $end între ghilimele și asta aruncă o eroare (cel puțin în cazul meu)

function get_min_max_meta_value( $type = 'max', $key ){

    global $wpdb;
    $cash_key = md5($key . $type);
    $results = wp_cache_get($key);

    if($results === false){

        $sql = "SELECT " . $type . "( cast( meta_value as UNSIGNED ) ) FROM {$wpdb->postmeta} WHERE meta_key='%s'";
        $query = $wpdb->prepare( $sql, $key);

        return $wpdb->get_var( $query );

    }

    return $results;
}
6 mai 2014 17:42:31
0

Aici este o soluție improvizată pe care am folosit-o utilizând funcția php max array și WP_Query integrat

    function get_max_post_meta_value($category_id) {

    $args = array(  
    'post_type' => 'cpt-name', // tipul postului personalizat
    'post_status' => 'publish', // doar postări publicate
    'cat' => $category_id, // ID-ul categoriei
    'posts_per_page' => 1000, // numărul maxim de postări
    );

    $max_meta_value_array = array(); // inițializare array pentru valori meta

    $loop = new WP_Query( $args ); // interogare WP

    while ( $loop->have_posts() ) : $loop->the_post(); 

            // adăugare valoare meta în array
            array_push($max_meta_value_array, get_post_meta( get_the_ID(), 'post_meta_name', true)  );

    endwhile;

    wp_reset_postdata(); // resetare date post

    return max($max_meta_value_array) ; // returnare valoarea maximă

    }
28 iul. 2022 23:33:36