Wie kann ein Filter verknüpft werden, um get_post_meta abzufangen, wenn eine benutzerdefinierte Feldausgabe abgewechselt wird?

9

Wie kann ein Filter verknüpft werden, um get_post_meta abzufangen, wenn eine benutzerdefinierte Feldausgabe abgewechselt wird?

Ich habe ein benutzerdefiniertes Feld (Metadaten) in einem Beitrag wie folgt ausgefüllt:

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

Ich muss diese Ausgabe übersetzen lassen, also frage ich mich, wie ich mich vor der Metadatenausgabe in "get_post_meta" einbinden kann.

Hier ist, was ich seit ein paar Tagen versucht habe, aber kein Glück.

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);
micheal
quelle
2
Was Sie tun, sollte funktionieren. Welcher "Wert" wurde nicht übergeben?
s_ha_dum

Antworten:

8

Nachdem ich viel herumgespielt habe, denke ich, dass ich hier eine ziemlich gute Lösung gefunden habe. Mir ist klar, dass dies über ein Jahr ist, nachdem Sie gefragt haben, aber das hat mich gestört und ich konnte bis jetzt keine gute Lösung finden.

Das Problem ist, dass Sie mit der Funktion get_post_metadata nicht auf den aktuellen Wert zugreifen können. Dies bedeutet, dass Sie den Wert nicht transformieren können. Ersetzen Sie ihn einfach. Ich musste Inhalte an ein Metafeld anhängen, und wo sie ausgegeben wurden, waren keine Filter zulässig.

Hier ist meine Lösung, die an die Anforderungen dieser Frage angepasst wurde:

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

Dadurch bleiben alle anderen get_post_metadata-Filter intakt und der ursprüngliche Wert kann geändert werden.

joshcanhelp
quelle
5

Hatte gerade das gleiche Problem und mit dem obigen Code habe ich Folgendes gelöst:

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

Ich habe versucht, apply_filters, get_metadata, get_post_meta direkt in der Funktion zu verwenden, aber sie erlaubten mir nicht, die resultierende Ausgabe zu manipulieren, also habe ich auf $ wpdb zurückgegriffen.

Forlogos
quelle
Beachten Sie, dass dadurch verhindert wird, dass das gefilterte Meta im Objektcache zwischengespeichert wird. @ Joshcanhelp Lösung wird nicht darunter leiden, da es immer noch aufruftget_post_meta()
Z. Zlatev
Dadurch wird Ihr Datenbankserver DDOS.
svandragt
Beim Caching korrigieren. get_post_meta ist besser zu verwenden, aber zu dem Zeitpunkt im Jahr 2014 würde es nicht in der Funktion ausgeführt. Aber einen DB-Server zum Absturz bringen - das glaube ich nicht. Die Abfrage get_var entspricht get_post_meta und ist eine einfache Abfrage. Selbst wenn es hunderte Male auf einer Seite ausgeführt würde, würde es einen Server nicht zum Absturz bringen. Es läuft seit 2014 ohne Probleme in Produktion.
Forlogos
0

Hier ist meine Lösung zum Filtern von Post-Meta. Dies ruft dann eine benutzerdefinierte Funktion auf, um alle erforderlichen Datenmanipulationen durchzuführen.

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);
Mark Tierney
quelle