¿Cómo enganchar un filtro para capturar get_post_meta al alternar la salida de un campo personalizado?

8 nov 2013, 14:28:58
Vistas: 20.1K
Votos: 9

¿Cómo enganchar un filtro para capturar get_post_meta cuando se alterna la salida de un campo personalizado?

He llenado un campo personalizado (metadatos) en una entrada, de esta manera:

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

Necesito obtener esta salida traducida, así que me pregunto cómo enganchar en "get_post_meta" antes de la salida de los metadatos.

Esto es lo que he intentado durante algunos días, pero sin éxito.

function getqtlangcustomfieldvalue($metadata, $object_id, $meta_key, $single){
    $fieldtitle="fields_titles";
    if($meta_key==$fieldtitle && isset($meta_key)){
         //aquí está la captura, pero ningún valor ha sido pasado
    }
}
//Especificar 4 argumentos para este filtro en el último parámetro
add_filter('get_post_metadata', 'getqtlangcustomfieldvalue', 10, 4);
1
Comentarios

Lo que estás haciendo debería funcionar. ¿Qué "value" no se ha pasado?

s_ha_dum s_ha_dum
8 nov 2013 17:35:59
Todas las respuestas a la pregunta 3
1
17

Después de mucho experimentar con esto, creo que encontré una solución bastante buena aquí. Me doy cuenta de que esto es más de un año después de que preguntaste, pero esto me estaba molestando y no pude encontrar una buena solución hasta ahora.

El problema es que la función get_post_metadata no te permite acceder al valor actual. Esto significa que no puedes transformar el valor, solo reemplazarlo. Yo necesitaba añadir contenido a un campo meta y donde se mostraba no permitía filtros de ningún tipo.

Aquí está mi solución, adaptada para lo que esta pregunta solicita:

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

    // Aquí está el truco, añade controles adicionales si es necesario (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);

        // Haz lo que necesites con el valor meta - traducir, añadir, etc
        // $current_meta = qtlangcustomfieldvalue_translate( $current_meta );
        // $current_meta .= ' Texto añadido';
        return $current_meta;
    }

    // Devuelve el original si la comprobación no pasa
    return $metadata;

}

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

Esto mantendrá intactos cualquier otro filtro get_post_metadata y permitirá la modificación del valor original.

17 ene 2015 18:55:06
Comentarios

Si estás obteniendo un array serializado desde post meta, tal vez necesites devolver el valor dentro de un nuevo array. Ejemplo: return array( $metadata );

Pablo S G Pacheco Pablo S G Pacheco
23 dic 2022 00:18:37
3

Acabo de tener el mismo problema y, usando tu código anterior, así es como lo resolví:

function getqtlangcustomfieldvalue($metadata, $object_id, $meta_key, $single) {
    $fieldtitle="fields_titles"; // No traducir nombre de variable
    if($meta_key==$fieldtitle&& isset($meta_key)) {
        //usar $wpdb para obtener el valor
        global $wpdb;
        $value = $wpdb->get_var( "SELECT meta_value FROM $wpdb->postmeta WHERE post_id = $object_id AND  meta_key = '".$meta_key."'" );

        //hacer lo que sea con $value

        return $value;
    }
}
add_filter('get_post_metadata', 'getqtlangcustomfieldvalue', 10, 4);

Intenté usar apply_filters, get_metadata, get_post_meta directamente dentro de la función pero no me permitían manipular el resultado, así que terminé usando $wpdb.

12 sept 2014 19:31:22
Comentarios

Cuidado, esto evitará que los metadatos filtrados se almacenen en caché en el objeto de caché. La solución de @joshcanhelp no sufrirá ese problema ya que todavía llama a get_post_meta()

Z. Zlatev Z. Zlatev
19 may 2018 12:55:57

Esto causará un ataque DDoS a tu servidor de bases de datos.

svandragt svandragt
29 ene 2019 13:31:54

Correcto sobre el caché. get_post_meta es mejor para usar, pero en ese momento en 2014, no funcionaba en la función.

Pero que colapse un servidor de bases de datos - no lo creo. La consulta get_var es equivalente a get_post_meta y es una consulta simple. Incluso si se ejecutara cientos de veces en una página, no colapsaría un servidor. Ha estado funcionando en producción desde 2014 sin problemas.

forlogos forlogos
30 ene 2019 14:32:20
0

Aquí está mi solución para filtrar meta datos de publicaciones. Luego llama a una función personalizada para realizar cualquier manipulación de datos requerida.

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);
12 sept 2018 11:41:30