Como conectar um filtro para capturar get_post_meta quando uma saída de campo personalizada é alternativa?

9

Como conectar um filtro para capturar get_post_meta quando uma saída de campo personalizada é alternativa?

Eu preenchi um campo personalizado (metadados) em uma postagem, assim:

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

Eu preciso obter essa saída traduzida, então, me perguntando como conectar-se a "get_post_meta" antes da saída de metadados.

Aqui está o que eu tentei por alguns dias, mas sem sorte.

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
fonte
2
O que você está fazendo deve funcionar. Qual "valor" não foi passado?
s_ha_dum

Respostas:

8

Depois de muita brincadeira com isso, acho que encontrei uma solução bastante boa aqui. Sei que isso aconteceu mais de um ano depois que você perguntou, mas isso estava me incomodando e não consegui encontrar uma boa solução até agora.

O problema é que a função get_post_metadata não permite acessar o valor atual. Isso significa que você não é capaz de transformar o valor, basta substituí-lo. Eu precisava anexar o conteúdo a um meta-campo e onde ele foi produzido não permitia nenhum tipo de filtro.

Aqui está a minha solução, alterada para se adequar ao que essa pergunta faz:

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

Isso manterá intactos outros filtros get_post_metadata e permitirá a modificação do valor original.

joshcanhelp
fonte
5

Acabei de ter o mesmo problema e, usando seu código acima, eis como eu o resolvi:

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

Eu tentei usar apply_filters, get_metadata, get_post_meta diretamente dentro da função, mas eles não me permitiram manipular a saída resultante, então comecei a usar $ wpdb.

forlogos
fonte
Cuidado, isso impedirá que a meta filtrada seja armazenada em cache no cache de objetos. A solução do @ joshcanhelp não sofrerá com isso, uma vez que ainda chamaget_post_meta()
Z. Zlatev
Isso fará o DDOS do servidor de banco de dados.
svandragt
Correto no cache. É melhor usar o get_post_meta, mas em 2014, não funcionava na função. Mas travar um servidor db - acho que não. A consulta get_var é equivalente a get_post_meta e é uma consulta simples. Mesmo que fosse executado centenas de vezes em uma página, não travaria um servidor. Está em produção desde 2014 sem problemas.
forlogos 30/01/19
0

Aqui está a minha solução para filtrar a meta post. Isso então chama uma função personalizada para executar qualquer manipulação de dados necessária.

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
fonte