Come agganciare un filtro per catturare get_post_meta quando si alterna un output di campo personalizzato?


9

Come agganciare un filtro per catturare get_post_meta quando si alterna un output di campo personalizzato?

Ho compilato un campo personalizzato (metadati) in un post, proprio come questo:

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

Devo tradurre questo output, quindi mi chiedo come collegarmi a "get_post_meta" prima dell'output dei metadati.

Ecco cosa ho provato per alcuni giorni, ma senza fortuna.

function getqtlangcustomfieldvalue($metadata, $object_id, $meta_key, $single){
    $fieldtitle="fields_titles";
    if($meta_key==$fieldtitle&& isset($meta_key)){
         //here is the catch, but no value has been passed
    }
}
//Specify 4 arguments for this filter in the last parameter.
add_filter('get_post_metadata', 'getqtlangcustomfieldvalue', 10, 4);

2
Quello che stai facendo dovrebbe funzionare. Quale "valore" non è stato passato?
s_ha_dum,

Risposte:


8

Dopo un sacco di problemi con questo, penso di aver trovato una soluzione abbastanza buona qui. Mi rendo conto che è passato più di un anno dalla tua richiesta, ma questo mi dava fastidio e finora non sono riuscito a trovare una buona soluzione.

Il problema è che la funzione get_post_metadata non ti consente di accedere al valore corrente. Questo significa che non sei in grado di trasformare il valore, basta sostituirlo. Avevo bisogno di aggiungere contenuto a un metacampo e dove era stato emesso non consentiva filtri di alcun tipo.

Ecco la mia soluzione, modificata per adattarsi a ciò che questa domanda pone:

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

    // Here is the catch, add additional controls if needed (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);

        // Do what you need to with the meta value - translate, append, etc
        // $current_meta = qtlangcustomfieldvalue_translate( $current_meta );
        // $current_meta .= ' Appended text';
        return $current_meta;
    }

    // Return original if the check does not pass
    return $metadata;

}

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

Ciò manterrà intatti tutti gli altri filtri get_post_metadata e consentirà la modifica del valore originale.


5

Ho appena avuto lo stesso problema e, usando il 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)) {
        //use $wpdb to get the value
        global $wpdb;
        $value = $wpdb->get_var( "SELECT meta_value FROM $wpdb->postmeta WHERE post_id = $object_id AND  meta_key = '".$meta_key."'" );

        //do whatever with $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 hanno permesso di manipolare l'output risultante, quindi ho fatto ricorso all'uso di $ wpdb.


Attenzione, questo eviterà che il meta filtrato venga memorizzato nella cache degli oggetti. La soluzione di @joshcanhelp non ne risentirà poiché chiama ancoraget_post_meta()
Z. Zlatev,

Questo farà DDOS il tuo server di database.
svandragt,

Corretto alla memorizzazione nella cache. get_post_meta è meglio usare, ma al momento nel 2014 non funzionava nella funzione. Ma crash un server db - non credo. La query get_var è equivalente a get_post_meta ed è una query semplice. Anche se fosse eseguito centinaia di volte su una pagina, non si arresterebbe in modo anomalo su un server. È in produzione dal 2014 senza problemi.
forlogos,

0

Ecco la mia soluzione per filtrare i meta post. Questo quindi 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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.