Làm cách nào để móc bộ lọc để bắt get_post_meta khi thay thế một đầu ra trường tùy chỉnh?


9

Làm cách nào để móc bộ lọc để bắt get_post_meta khi thay thế một đầu ra trường tùy chỉnh?

Tôi đã điền vào một trường tùy chỉnh (dữ liệu meta) trong một bài đăng, giống như thế này:

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

Tôi cần dịch đầu ra này, vì vậy tôi tự hỏi làm thế nào để nối vào "get_post_meta" trước khi xuất dữ liệu meta.

Đây là những gì tôi đã cố gắng trong vài ngày, nhưng không có may mắn.

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

2
Những gì bạn đang làm nên làm việc. "Giá trị" nào chưa được thông qua?
s_ha_dum

Câu trả lời:


8

Sau rất nhiều rắc rối với điều này, tôi nghĩ rằng tôi đã tìm thấy một giải pháp khá tốt ở đây. Tôi nhận ra điều này đã hơn một năm sau khi bạn hỏi nhưng điều này đã làm phiền tôi và tôi không thể tìm ra giải pháp tốt cho đến bây giờ.

Vấn đề là hàm get_post_metadata không cho phép bạn truy cập giá trị hiện tại. Điều này có nghĩa là bạn không thể chuyển đổi giá trị, chỉ cần thay thế nó. Tôi cần nối thêm nội dung vào trường meta và nơi đầu ra không cho phép các bộ lọc dưới bất kỳ hình thức nào.

Đây là giải pháp của tôi, đã thay đổi để phù hợp với những gì câu hỏi này yêu cầu:

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

Điều này sẽ giữ nguyên các bộ lọc get_post_metadata khác và cho phép sửa đổi giá trị ban đầu.


5

Chỉ có cùng một vấn đề và, sử dụng mã của bạn ở trên, đây là cách tôi giải quyết nó:

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

Tôi đã thử sử dụng application_filters, get_metadata, get_post_meta trực tiếp trong hàm nhưng chúng không cho phép tôi thao tác kết quả đầu ra, vì vậy tôi đã sử dụng $ wpdb.


Coi chừng, điều này sẽ ngăn meta được lọc khỏi bộ nhớ cache trong bộ đệm đối tượng. Giải pháp của @ joshcanhelp sẽ không bị ảnh hưởng vì nó vẫn gọiget_post_meta()
Z. Zlatev

Điều này sẽ DDOS máy chủ cơ sở dữ liệu của bạn.
Svandragt

Đúng về bộ nhớ đệm. get_post_meta tốt hơn để sử dụng, nhưng tại thời điểm trở lại vào năm 2014, nó sẽ không chạy trong chức năng. Nhưng làm sập một máy chủ db - tôi không nghĩ vậy. Truy vấn get_var tương đương với get_post_meta và là một truy vấn đơn giản. Ngay cả khi nó được chạy hàng trăm lần trên một trang, nó sẽ không làm sập máy chủ. Nó đã được sản xuất từ ​​năm 2014 mà không có vấn đề gì.
forlogos

0

Đây là giải pháp của tôi để lọc meta bài. Điều này sau đó gọi một chức năng tùy chỉnh để thực hiện bất kỳ thao tác dữ liệu cần thiết.

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.