Comment accrocher un filtre pour attraper get_post_meta lors de l'alternance d'une sortie de champ personnalisé?

9

Comment accrocher un filtre pour attraper get_post_meta lors de l'alternance d'une sortie de champ personnalisé?

J'ai rempli un champ personnalisé (métadonnées) dans un message, comme ceci:

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

J'ai besoin de traduire cette sortie, donc je me demande comment me connecter à "get_post_meta" avant la sortie des métadonnées.

Voici ce que j'ai essayé depuis quelques jours, mais pas de chance.

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
la source
2
Ce que vous faites devrait fonctionner. Quelle "valeur" n'a pas été transmise?
s_ha_dum

Réponses:

8

Après avoir beaucoup gâché cela, je pense avoir trouvé une assez bonne solution ici. Je me rends compte que c'est plus d'un an après que vous ayez demandé, mais cela me dérangeait et je n'ai pas trouvé de bonne solution jusqu'à présent.

Le problème est que la fonction get_post_metadata ne vous permet pas d'accéder à la valeur actuelle. Cela signifie que vous ne pouvez pas transformer la valeur, remplacez-la simplement. J'avais besoin d'ajouter du contenu à un méta-champ et où il était sorti, je n'autorisais aucun filtre.

Voici ma solution, modifiée pour correspondre à ce que cette question demande:

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

Cela gardera intacts tous les autres filtres get_post_metadata et permettra la modification de la valeur d'origine.

joshcanhelp
la source
5

Juste eu le même problème et, en utilisant votre code ci-dessus, voici comment je l'ai résolu:

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

J'ai essayé d'utiliser apply_filters, get_metadata, get_post_meta directement dans la fonction, mais ils ne me permettaient pas de manipuler la sortie résultante, j'ai donc eu recours à $ wpdb.

forlogos
la source
Attention, cela empêchera la méta filtrée d'être mise en cache dans le cache d'objets. La solution de @ joshcanhelp n'en souffrira pas puisqu'elle appelle toujoursget_post_meta()
Z. Zlatev
Cela va DDOS votre serveur de base de données.
svandragt
Correct sur la mise en cache. get_post_meta est préférable d'utiliser, mais à l'époque en 2014, il ne fonctionnerait pas dans la fonction. Mais planter un serveur db - je ne pense pas. La requête get_var est équivalente à get_post_meta et est une requête simple. Même s'il était exécuté des centaines de fois sur une page, il ne planterait pas un serveur. Il fonctionne en production depuis 2014 sans aucun problème.
forlogos
0

Voici ma solution pour filtrer les méta post. Cela appelle ensuite une fonction personnalisée pour effectuer toute manipulation de données requise.

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
la source