web-dev-qa-db-fra.com

Comment accrocher un filtre pour intercepter get_post_meta lorsqu’il alterne une sortie de champ personnalisé?

Comment accrocher un filtre pour intercepter get_post_meta lorsqu’il alterne une sortie de champ personnalisé?

J'ai remplir un champ personnalisé (méta-données) dans un message, juste comme ceci:

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

J'ai besoin de faire 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é pendant 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);
8
micheal

Après avoir beaucoup bousculé cela, je pense avoir trouvé une assez bonne solution ici. Je me rends compte que cela fait plus d’un an après que vous l’avez demandé, mais cela me dérangeait et je ne trouvais pas de solution satisfaisante 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 l'emplacement de sortie n'autorisait aucun filtre.

Voici ma solution, adaptée à 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 préservera tous les autres filtres get_post_metadata et permettra la modification de la valeur d'origine.

8
joshcanhelp

Je viens d'avoir 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. Je me suis donc tourné vers $ wpdb.

5
forlogos

Voici ma solution pour filtrer post meta. Ceci 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);
0
Mark Tierney