Biblioteka multimediów - Ogranicz obrazy do niestandardowego typu postów

10

Czy jest jakaś magia / wtyczka wordpress, która sprawi, że biblioteka multimediów pokaże tylko obrazy przesłane do określonego niestandardowego typu posta? Mam niestandardowy typ posta o nazwie „artyści”. Chcę, aby po kliknięciu przez administratora przesłać / załączyć obraz, w wyskakującym oknie biblioteki multimediów wyświetlane są tylko obrazy, które zostały przesłane do niestandardowego typu artysty, a nie cała witryna.

Używam wtyczki ACF do obsługi niestandardowych pól i niestandardowych typów postów interfejsu użytkownika. czy to możliwe?

BillyMedia
źródło
Pozwól, że sprawdzę, czy dobrze to rozumiem ... Więc chcesz zmienić wyskakujące okno biblioteki multimediów w taki sposób, aby wyświetlało tylko obrazy, które zostały przesłane do określonego CPT, jeśli otworzysz go podczas edycji tego CPT. I powinno działać jak zawsze, gdy edytujesz inne typy postów?
Krzysiek Dróżdż
Jaki jest kontekst / uzasadnienie tego? Czy próbujesz wdrożyć selektor wykonawców?
Tom J Nowell
1
Przypadek użycia w moim przypadku to duża witryna WordPress, w której nie wszyscy edytują te same typy postów. O wiele bardziej uporządkowane (i przydatne) jest pokazanie najnowszych powiązanych plików, w przeciwieństwie do plików z całej witryny, dzięki czemu można łatwo wybrać pliki, które trzeba ponownie wykorzystać. (Nie zadałem tego pytania pierwotnie, ale dodałem nagrodę. Staram się zrobić dokładnie to, co opisał Krzysiek (dzięki za odpowiedź, spróbuję))
guidod

Odpowiedzi:

9

Nie jestem w 100% pewien, czy dobrze rozwiążę twój problem, ale ... Może to ci pomoże ...

Program do przesyłania multimediów pobiera załączniki w prosty sposób WP_Query, dzięki czemu można używać wielu filtrów do modyfikowania jego zawartości.

Jedynym problemem jest to, że nie można wyszukiwać postów z określonym CPT jako rodzicem za pomocą WP_Queryargumentów ... Więc będziemy musieli użyć posts_wherei posts_joinfiltrować.

Aby mieć pewność, że zmienimy tylko zapytanie przesyłającego media, użyjemy ajax_query_attachments_args.

I tak to wygląda w połączeniu:

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

Po otwarciu okna dialogowego programu do przesyłania multimediów podczas edytowania postu (post / page / CPT) zobaczysz tylko obrazy dołączone do tego konkretnego typu posta.

Jeśli chcesz, aby działał tylko dla jednego określonego typu posta (powiedzmy, strony), musisz zmienić warunek w my_posts_wherefunkcji tak:

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;
}
Krzysiek Dróżdż
źródło
Dziękujemy za pomocny komentarz. Usunąłem odpowiedź, aby nikogo nie mylić. +1 na twoim.
jackreichert
0

Wyświetlaj tylko obrazy właściwości podczas edycji wyróżnionego obrazu

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;
}
Azzam
źródło