Cum să adăugăm un filtru pentru interceptarea get_post_meta când alternăm afișarea unui câmp personalizat?

8 nov. 2013, 14:28:58
Vizualizări: 20.1K
Voturi: 9

Cum să adăugăm un filtru pentru a intercepta get_post_meta când alternăm afișarea unui câmp personalizat?

Am completat un câmp personalizat (meta data) într-un articol, în acest fel:

<!--:de-->Nominale spanning<!--:--><!--:zh/cn-->额定电压<!--:--><!--:en-->Arrester Accessories<!--:-->

Trebuie să obțin această valoare tradusă, așa că mă întreb cum să adaug un filtru la "get_post_meta" înainte ca datele meta să fie afișate.

Iată ce am încercat în ultimele zile, dar fără succes:

function getqtlangcustomfieldvalue($metadata, $object_id, $meta_key, $single){
    $fieldtitle="fields_titles";
    if($meta_key==$fieldtitle && isset($meta_key)){
         //aici este punctul de interceptare, dar nicio valoare nu a fost transmisă
    }
}
//Specifică 4 argumente pentru acest filtru în ultimul parametru
add_filter('get_post_metadata', 'getqtlangcustomfieldvalue', 10, 4);
1
Comentarii

Ceea ce faci ar trebui să funcționeze. Ce "valoare" nu a fost transmisă?

s_ha_dum s_ha_dum
8 nov. 2013 17:35:59
Toate răspunsurile la întrebare 3
1
17

După mult timp petrecut experimentând cu acest lucru, cred că am găsit o soluție destul de bună aici. Îmi dau seama că a trecut peste un an de când ai întrebat, dar acest lucru m-a deranjat și nu am putut găsi o soluție bună până acum.

Problema este că funcția get_post_metadata nu vă permite să accesați valoarea curentă. Aceasta înseamnă că nu puteți transforma valoarea, ci doar să o înlocuiți. Aveam nevoie să adaug conținut la un câmp meta și locul unde era afișat nu permitea filtre de niciun fel.

Iată soluția mea, adaptată pentru a răspunde la întrebarea din acest subiect:

function getqtlangcustomfieldvalue($metadata, $object_id, $meta_key, $single){

    // Aici este captura, adăugați controale suplimentare dacă este necesar (post_type, etc)
    $meta_needed = 'fields_titles';
    if ( isset( $meta_key ) && $meta_needed == $meta_key ){
        remove_filter( 'get_post_metadata', 'getqtlangcustomfieldvalue', 100 );
        $current_meta = get_post_meta( $object_id, $meta_needed, TRUE );
        add_filter('get_post_metadata', 'getqtlangcustomfieldvalue', 100, 4);

        // Faceți ce aveți nevoie cu valoarea meta - traduceți, adăugați, etc
        // $current_meta = qtlangcustomfieldvalue_translate( $current_meta );
        // $current_meta .= ' Text adăugat';
        return $current_meta;
    }

    // Returnați originalul dacă verificarea nu este trecută
    return $metadata;

}

add_filter( 'get_post_metadata', 'getqtlangcustomfieldvalue', 100, 4 );

Aceasta va păstra intacte orice alte filtre get_post_metadata și va permite modificarea valorii originale.

17 ian. 2015 18:55:06
Comentarii

Dacă obții un array serializat din meta postării, poate ai nevoie să returnezi valoarea în interiorul unui nou array. Exemplu: return array( $metadata );

Pablo S G Pacheco Pablo S G Pacheco
23 dec. 2022 00:18:37
3

Am avut aceeași problemă și, folosind codul tău de mai sus, iată cum am rezolvat-o:

function getqtlangcustomfieldvalue($metadata, $object_id, $meta_key, $single) {
    $fieldtitle="fields_titles";
    if($meta_key==$fieldtitle&& isset($meta_key)) {
        //folosește $wpdb pentru a obține valoarea
        global $wpdb;
        $value = $wpdb->get_var( "SELECT meta_value FROM $wpdb->postmeta WHERE post_id = $object_id AND  meta_key = '".$meta_key."'" );

        //fă ce vrei cu $value

        return $value;
    }
}
add_filter('get_post_metadata', 'getqtlangcustomfieldvalue', 10, 4);

Am încercat să folosesc apply_filters, get_metadata, get_post_meta direct în cadrul funcției, dar nu mi-au permis să manipulez rezultatul, așa că am recurs la utilizarea $wpdb.

12 sept. 2014 19:31:22
Comentarii

Atenție, acest lucru va împiedica stocarea în cache a metadatelor filtrate în memoria cache a obiectelor. Soluția lui @joshcanhelp nu va avea această problemă deoarece în continuare apelează get_post_meta()

Z. Zlatev Z. Zlatev
19 mai 2018 12:55:57

Aceasta va supraîncărca serverul de baze de date (DDOS).

svandragt svandragt
29 ian. 2019 13:31:54

Corect în privința cache-ului. get_post_meta este mai bine de utilizat, dar la vremea aceea în 2014, nu funcționa în cadrul funcției.

Dar să pici un server de baze de date - nu cred. Interogarea get_var este echivalentă cu get_post_meta și este o simplă interogare. Chiar dacă ar fi rulată de sute de ori pe o pagină, nu ar putea să dea jos un server. Rulează în producție din 2014 fără probleme.

forlogos forlogos
30 ian. 2019 14:32:20
0

Iată soluția mea pentru filtrarea metadatelor postărilor. Aceasta apelează apoi o funcție personalizată pentru a efectua orice manipulare necesară a datelor.

public function filter_post_meta($metadata = null, $object_id, $meta_key, $single)
{
    $meta_cache = wp_cache_get($object_id, 'post_meta');

    if ( !$meta_cache ) {
        $meta_cache = update_meta_cache( 'post', array( $object_id ) );
        $meta_cache = $meta_cache[$object_id];
    }

    if ( ! $meta_key ) {
        foreach ($meta_cache as $key => $val) {
            foreach ($val as $k => $v) {
                $meta_cache[$key][$k] = yourCustomFunction($v);
            }
        }

        return $meta_cache;
    }

    if ( isset($meta_cache[$meta_key]) ) {
        if ( $single ) {
            $value = maybe_unserialize( $meta_cache[$meta_key][0] );

            return yourCustomFunction($value);
        } else {
            return array_map(
                'maybe_unserialize',
                array_map(
                    'yourCustomFunction',
                    $meta_cache[$meta_key]
                )
            );
        }
    }

    return $single ? '' : [];
}

add_filter('get_post_metadata', 'filter_post_meta', 100, 4);
12 sept. 2018 11:41:30