Cum să adăugăm un filtru pentru interceptarea get_post_meta când alternăm afișarea unui câmp personalizat?
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);
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.

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.

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()

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.

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