¿Cómo enganchar un filtro para capturar get_post_meta al alternar la salida de un campo personalizado?
¿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);

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.

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.

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

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.

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