Thư viện phương tiện - Giới hạn hình ảnh cho loại bài đăng tùy chỉnh


10

Có một số ma thuật / plugin wordpress sẽ làm cho thư viện phương tiện chỉ hiển thị hình ảnh được tải lên một loại bài đăng tùy chỉnh cụ thể? Tôi có một loại bài đăng tùy chỉnh được gọi là "nghệ sĩ", tôi muốn, khi quản trị viên nhấp để tải lên / đính kèm hình ảnh, cửa sổ bật lên của thư viện phương tiện chỉ hiển thị hình ảnh đã được tải lên loại tùy chỉnh của nghệ sĩ chứ không phải toàn bộ trang web.

Tôi sử dụng plugin ACF để xử lý các trường tùy chỉnh và các loại bài tùy chỉnh ui. Điều này có thể không?


Hãy để tôi kiểm tra xem tôi có hiểu đúng không ... Vì vậy, bạn muốn thay đổi cửa sổ bật lên của thư viện phương tiện theo cách nó chỉ hiển thị hình ảnh được tải lên CPT cụ thể nếu bạn mở nó trong khi chỉnh sửa CPT này. Và nó sẽ hoạt động như mọi khi khi bạn chỉnh sửa các loại bài đăng khác?
Krzysiek Dróżdż

Bối cảnh / lý do đằng sau làm điều này là gì? Bạn đang cố gắng để thực hiện một công cụ chọn nghệ sĩ?
Tom J Nowell

1
Trường hợp sử dụng trong trường hợp của tôi là một trang web WordPress lớn, nơi không phải ai cũng chỉnh sửa các loại bài đăng giống nhau. Sẽ gọn gàng hơn (và hữu ích) để hiển thị các tệp tải lên liên quan gần đây nhất trái ngược với tải lên từ khắp nơi trên trang web, do đó có thể dễ dàng chọn các tệp cần được sử dụng lại. (Tôi đã không hỏi câu hỏi này ban đầu nhưng đã thêm tiền thưởng. Tôi đang cố gắng thực hiện chính xác những gì Krzysiek đã mô tả (cảm ơn vì câu trả lời, tôi sẽ thử nó))
hướng dẫn

Câu trả lời:


9

Tôi không chắc chắn 100% nếu tôi hiểu đúng vấn đề của bạn, nhưng ... Có lẽ điều này sẽ giúp bạn ...

Trình tải lên đa phương tiện có các tệp đính kèm đơn giản WP_Query, vì vậy bạn có thể sử dụng nhiều bộ lọc để sửa đổi nội dung của nó.

Vấn đề duy nhất là bạn không thể truy vấn các bài đăng có CPT cụ thể bằng cách sử dụng WP_Queryđối số ... Vì vậy, chúng tôi sẽ phải sử dụng posts_whereposts_joinlọc.

Để chắc chắn, chúng tôi sẽ chỉ thay đổi truy vấn của người tải lên phương tiện, chúng tôi sẽ sử dụng ajax_query_attachments_args.

Và đây là giao diện của nó, khi kết hợp:

function my_posts_where($where) {
    global $wpdb;

    $post_id = false;
    if ( isset($_POST['post_id']) ) {
        $post_id = $_POST['post_id'];

        $post = get_post($post_id);
        if ( $post ) {
            $where .= $wpdb->prepare(" AND my_post_parent.post_type = %s ", $post->post_type);
        }
    }

    return $where;
}

function my_posts_join($join) {
    global $wpdb;

    $join .= " LEFT JOIN {$wpdb->posts} as my_post_parent ON ({$wpdb->posts}.post_parent = my_post_parent.ID) ";

    return $join;
}


function my_bind_media_uploader_special_filters($query) {
    add_filter('posts_where', 'my_posts_where');
    add_filter('posts_join', 'my_posts_join');

    return $query;
}
add_filter('ajax_query_attachments_args', 'my_bind_media_uploader_special_filters');

Khi bạn mở hộp thoại tải lên phương tiện trong khi chỉnh sửa bài đăng (bài / trang / CPT), bạn sẽ chỉ thấy hình ảnh được đính kèm với loại bài đăng cụ thể này.

Nếu bạn muốn nó chỉ hoạt động cho một loại bài đăng cụ thể (giả sử các trang), bạn sẽ phải thay đổi điều kiện trong my_posts_wherechức năng như vậy:

function my_posts_where($where) {
    global $wpdb;

    $post_id = false;
    if ( isset($_POST['post_id']) ) {
        $post_id = $_POST['post_id'];

        $post = get_post($post_id);
        if ( $post && 'page' == $post->post_type ) {  // you can change 'page' to any other post type
            $where .= $wpdb->prepare(" AND my_post_parent.post_type = %s ", $post->post_type);
        }
    }

    return $where;
}

Cảm ơn bình luận hữu ích của bạn, tôi đã xóa câu trả lời của mình để không gây nhầm lẫn cho bất cứ ai. +1 trên của bạn.
jackre Richt

0

Chỉ hiển thị hình ảnh của tài sản khi chỉnh sửa hình ảnh đặc trưng

function my_bind_media_uploader_special_filters($query) 
{

    add_filter('posts_where', 'my_posts_where');
    return $query;
}

add_filter('ajax_query_attachments_args','my_bind_media_uploader_special_filters');

function my_posts_where ($where) 
{

    global $wpdb;
    $post_id = false;
    if ( isset($_POST['post_id']) ) {
        $post_id = $_POST['post_id'];
        $post = get_post($post_id);
        if ( $post && 'property' == $post->post_type) {
            $where .= $wpdb->prepare(" AND id in (select distinct meta_value from 
            wpdb_postmeta where meta_key='fave_property_images' and post_id = $post_id)", 
            $post->post_type);
        }
    }
    return $where;
}
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.