Come intercettare un filtro per catturare get_post_meta quando si modifica l'output di un campo personalizzato?

8 nov 2013, 14:28:58
Visualizzazioni: 20.1K
Voti: 9

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

Quello che stai facendo dovrebbe funzionare. Quale "value" non è stato passato?

s_ha_dum s_ha_dum
8 nov 2013 17:35:59
Tutte le risposte alla domanda 3
1
17

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.

17 gen 2015 18:55:06
Commenti

Se stai ottenendo un array serializzato dai metadati del post, potrebbe essere necessario restituire il valore all'interno di un nuovo array. Esempio: return array( $metadata );

Pablo S G Pacheco Pablo S G Pacheco
23 dic 2022 00:18:37
3

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.

12 set 2014 19:31:22
Commenti

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

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

Questo causerà un attacco DDOS al tuo server database.

svandragt svandragt
29 gen 2019 13:31:54

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.

forlogos forlogos
30 gen 2019 14:32:20
0

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);
12 set 2018 11:41:30