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

9

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

He llenado un campo personalizado (metadatos) en una publicación, así:

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

Necesito traducir esta salida, así que me pregunto cómo conectarme a "get_post_meta" antes de la salida de metadatos.

Esto es lo que he probado durante unos días, pero no tuve suerte.

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
fuente
2
Lo que estás haciendo debería funcionar. ¿Qué "valor" no se ha pasado?
s_ha_dum

Respuestas:

8

Después de mucho jugar 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 lo 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 le permite acceder al valor actual. Esto significa que no puede transformar el valor, solo reemplácelo. Necesitaba agregar contenido a un metacampo y donde se imprimía no permitía ningún tipo de filtro.

Aquí está mi solución, modificada para ajustarse a lo que esta pregunta pregunta:

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

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

joshcanhelp
fuente
5

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

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

Intenté usar apply_filters, get_metadata, get_post_meta directamente dentro de la función, pero no me permitieron manipular el resultado resultante, así que recurrí al uso de $ wpdb.

forlogos
fuente
Tenga cuidado, esto evitará que el meta filtrado se almacene en la memoria caché de objetos. La solución de @joshcanhelp no sufrirá de eso ya que todavía llamaget_post_meta()
Z. Zlatev
Esto DDOS su servidor de base de datos.
svandragt
Correcto en el almacenamiento en caché. get_post_meta es mejor para usar, pero en 2014, no se ejecutaría en la función. Pero bloquee un servidor db, 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 bloquearía un servidor. Se ha estado ejecutando en producción desde 2014 sin problemas.
forlogos
0

Aquí está mi solución para filtrar metadatos. Esto 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);
Mark Tierney
fuente