Come intercettare un filtro per catturare get_post_meta quando si modifica l'output di un campo personalizzato?
Come intercettare un filtro per catturare get_post_meta quando si modifica l'output di un campo personalizzato?
Ho compilato un campo personalizzato (meta dati) in un post, in questo modo:
<!--:de-->Nominale spanning<!--:--><!--:zh/cn-->额定电压<!--:--><!--:en-->Arrester Accessories<!--:-->
Ho bisogno di ottenere questa traduzione dell'output, quindi mi chiedevo come intercettare "get_post_meta" prima dell'output dei meta dati.
Ecco cosa ho provato negli ultimi giorni, ma senza successo.
function getqtlangcustomfieldvalue($metadata, $object_id, $meta_key, $single){
$fieldtitle="fields_titles";
if($meta_key==$fieldtitle&& isset($meta_key)){
//qui è il punto di intercettazione, ma nessun valore è stato passato
}
}
//Specifica 4 argomenti per questo filtro nell'ultimo parametro.
add_filter('get_post_metadata', 'getqtlangcustomfieldvalue', 10, 4);
Dopo aver sperimentato a lungo con questo problema, penso di aver trovato una soluzione abbastanza valida qui. Mi rendo conto che sia passato più di un anno dalla tua domanda, ma questo problema mi ha dato fastidio e non sono riuscito a trovare una buona soluzione fino ad ora.
Il problema è che la funzione get_post_metadata non ti permette di accedere al valore corrente. Ciò significa che non puoi trasformare il valore, ma solo sostituirlo. Avevo bisogno di aggiungere contenuto a un campo meta e dove veniva visualizzato non permetteva filtri di alcun tipo.
Ecco la mia soluzione, modificata per adattarsi a quanto chiesto in questa domanda:
function getqtlangcustomfieldvalue($metadata, $object_id, $meta_key, $single){
// Ecco il punto cruciale, aggiungi ulteriori controlli se necessario (post_type, ecc.)
$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);
// Fai quello che devi con il valore meta - traduci, aggiungi, ecc.
// $current_meta = qtlangcustomfieldvalue_translate( $current_meta );
// $current_meta .= ' Testo aggiunto';
return $current_meta;
}
// Ritorna l'originale se il controllo non passa
return $metadata;
}
add_filter( 'get_post_metadata', 'getqtlangcustomfieldvalue', 100, 4 );
Questo manterrà intatti tutti gli altri filtri get_post_metadata e permetterà la modifica del valore originale.

Ho avuto lo stesso problema e, utilizzando il tuo codice sopra, ecco come l'ho risolto:
function getqtlangcustomfieldvalue($metadata, $object_id, $meta_key, $single) {
$fieldtitle="fields_titles";
if($meta_key==$fieldtitle&& isset($meta_key)) {
//uso $wpdb per ottenere il valore
global $wpdb;
$value = $wpdb->get_var( "SELECT meta_value FROM $wpdb->postmeta WHERE post_id = $object_id AND meta_key = '".$meta_key."'" );
//fai qualsiasi operazione con $value
return $value;
}
}
add_filter('get_post_metadata', 'getqtlangcustomfieldvalue', 10, 4);
Ho provato ad usare apply_filters, get_metadata, get_post_meta direttamente all'interno della funzione ma non mi permettevano di manipolare l'output risultante, quindi ho optato per usare $wpdb.

Attenzione, questo impedirà la memorizzazione nella cache oggetto dei metadati filtrati. La soluzione di @joshcanhelp non ha questo problema perché continua a chiamare get_post_meta()

Corretto riguardo alla cache. get_post_meta è meglio da usare, ma all'epoca nel 2014 non funzionava all'interno della funzione.
Ma far crashare un server db - non credo. La query get_var è equivalente a get_post_meta ed è una query semplice. Anche se eseguita centinaia di volte su una pagina, non farebbe crashare un server. È in esecuzione in produzione dal 2014 senza problemi.

Ecco la mia soluzione per filtrare i meta dei post. Questa poi chiama una funzione personalizzata per eseguire qualsiasi manipolazione dei dati richiesta.
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);
