3 comments

  1. After a lot of messing around with this, I think I found a fairly good solution here. I realize this is over a year after you asked but this was bothering me and I couldn’t find a good solution until now.

    The problem is that the get_post_metadata function doesn’t allow you to access the current value. This means you aren’t able to transform the value, just replace it. I needed to append content to a meta field and where it was output did not allow filters of any kind.

    Here’s my solution, altered to fit what this question asks:

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

    This will keep any other get_post_metadata filters intact and allow modification of the original value.

  2. Just had the same problem and, using your code above, here is how I solved it:

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

    I tried using apply_filters, get_metadata, get_post_meta directly within the function but they wouldn’t allow me to manipulate the resulting output, so I resorted to using $wpdb.

  3. Here’s my solution for filtering post meta. This then calls a custom function to perform any required data manipulation.

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

Comments are closed.