Jak dodać nową kartę do menedżera przesyłania multimediów z niestandardowym zestawem zdjęć?

18

Chciałbym dodać nową kartę do przesyłania menedżera i zdjęć z wewnętrznej listy

theme_folder/images/patterns

Próbowałem czegoś takiego, aby dodać kartę, ale to nie działa, ponieważ dodaje karty po stronie menedżera multimediów, ale po przesłaniu obrazu ta karta nie jest widoczna.

function custom_media_upload_tab_name( $tabs ) {
    $newtab = array( 'tab_slug' => 'Patterns' );
    return array_merge( $tabs, $newtab );
}

add_filter( 'media_upload_tabs', 'custom_media_upload_tab_name' );

function custom_media_upload_tab_content() {
    // Add you content here.
    echo 'Hello content';
}
add_action( 'media_upload_tab_slug', 'custom_media_upload_tab_content' );

a konkretnie tutaj chciałbym dodać nową kartę, a na tej karcie chciałbym wyświetlić listę obrazów z folderu motywu.

wprowadź opis zdjęcia tutaj

Wiem, że menedżer mediów JS musi zostać przepisany, ale szczerze mówiąc nie wiem od czego zacząć. Wygląda na to, że muszę napisać zupełnie nowy szablon dla menedżera multimediów, aby to osiągnąć.

Przeszedłem wszystkie sugestie, ale wydaje się, że nikt nie czyta pytania. Zgodnie z zaleceniem „Próbowałem czegoś takiego, aby dodać kartę, ale to nie działa, ponieważ dodaje karty po stronie menedżera multimediów, ale po przesłaniu obrazu ta karta nie jest widoczna”.

Na razie nikt nie jest w stanie znaleźć rozwiązania tego problemu.

Benn
źródło

Odpowiedzi:

6

To jest stary wątek, ale dla mnie wciąż tak samo istotny. Błąkam się i wymyśliłem ten kod, aby dodać tutaj kartę multimediów, może ktoś chciałby kontynuować w jaki sposób obsługiwać zawartość karty? :)

add_action('admin_enqueue_scripts', function(){
    wp_enqueue_script( 'my-media-tab', plugin_dir_url( __FILE__ ) . '/js/mytab.js', array( 'jquery' ), '', true );
});

A potem plik js:

var l10n = wp.media.view.l10n;
wp.media.view.MediaFrame.Select.prototype.browseRouter = function( routerView ) {
    routerView.set({
        upload: {
            text:     l10n.uploadFilesTitle,
            priority: 20
        },
        browse: {
            text:     l10n.mediaLibraryTitle,
            priority: 40
        },
        my_tab: {
            text:     "My tab",
            priority: 60
        }
    });
};

EDYCJA: Ok, więc. Do obsługi treści nie znalazłem dobrego sposobu na zrobienie tego przez wp.media. Moje obecne rozwiązanie to 2 lisenerów, jeden do otwierania biblioteki multimediów i jeden do klikania w menu routera multimediów;

jQuery(document).ready(function($){
    if ( wp.media ) {
        wp.media.view.Modal.prototype.on( "open", function() {
            if($('body').find('.media-modal-content .media-router a.media-menu-item.active')[0].innerText == "My tab")
                doMyTabContent();
        });
        $(wp.media).on('click', '.media-router a.media-menu-item', function(e){
            if(e.target.innerText == "My tab")
                doMyTabContent();
        });
    }
});

funkcja doMyTabContent (); jest po prostu czymś takim;

function doMyTabContent() {
    var html = '<div class="myTabContent">';
    //My tab content here
    html += '</div>';
    $('body .media-modal-content .media-frame-content')[0].innerHTML = html;
}

Jestem pewien, że można to zrobić w znacznie bardziej delikatny sposób. Ktokolwiek to czyta i ma lepsze rozwiązanie, proszę wypełnić :-)

gubbfett
źródło
dzięki za to zajrzy. Stare czy nie, nigdy nie zostało rozwiązane. i to jest dokładnie to, o co prosiłem prntscr.com/kse5yk . Dobra robota!
Benn
próbowałeś połączyć to wordpress.stackexchange.com/a/190604/67176 i tworzenie zakładek? Jestem 99% pewien, że to może działać, zwłaszcza jeśli karty mają ten sam identyfikator.
Benn,
1
Tak, przyjrzałem się temu najpierw, ale tak naprawdę nie jestem fanem rozwiązania iframe, które jest dostarczane z tym rozwiązaniem. Odbieranie danych obrazu za pomocą komunikatów iframe. Wyświetlanie treści to jedno, ale obsługa działań to coś innego. :) Może coś mi brakuje.
gubbfett,
Witaj @Benn ponownie złapał mnie w koszmary wp.media. Podany powyżej kod, w którym wykonuję „doMyTabContent”, wyzwala tylko jedno zdarzenie. Na przykład: Załaduj wpis, kliknij dodaj wyróżniony obraz i zamknij. Po tym kliknięciu dodaj media do posta i nic nie ładuje, prawdopodobnie dlatego, że wp.media jest w nowej instancji (karta wciąż tam jest). Nie jestem pewien, jak się tu przenieść. Czy poczyniłeś jakieś postępy w dodawaniu karty i wstawianiu multimediów? Chcesz podzielić się kodem? :)
gubbfett
@ubbfett, czy kiedykolwiek znalazłeś rozwiązanie tego problemu?
RaajTram
5

Zgodnie z kodeksem WordPress można dodać niestandardową kartę w programie do przesyłania multimediów w następujący sposób:

// add the tab
add_filter('media_upload_tabs', 'my_upload_tab');
function my_upload_tab($tabs) {
    $tabs['mytabname'] = "My Tab Name";
    return $tabs;
}

// call the new tab with wp_iframe
add_action('media_upload_mytabname', 'add_my_new_form');
function add_my_new_form() {
    wp_iframe( 'my_new_form' );
}

// the tab content
function my_new_form() {
    echo media_upload_header(); // This function is used for print media uploader headers etc.
    echo '<p>Example HTML content goes here.</p>';
}

Mam nadzieję, że ci to pomoże.

Touqeer Shafi
źródło
7
Żeby było jasne, ta zakładka nie jest dodawana na górze pola modalnego, ale na lewym pasku bocznym. Nie mogłem znaleźć sposobu, aby faktycznie dodać kartę na górze karty Wstawianie multimediów. Miałem również problemy z próbą użycia już dostępnych stylów css, ponieważ zawartość jest wstawiana do ramki iframe. Co prawdopodobnie oznacza, że ​​będziesz musiał dodać własny css, aby poprawnie wyświetlać obrazy. I tylko w celu uzupełnienia odpowiedzi można użyć funkcji php scandir (), aby pobrać wszystkie elementy w folderze obrazów.
gdaniel
-1
   function axcoto_genify_media_menu($tabs) {
            $newtab = array('genify'  => __('Axcoto Genify', 'axcotogenify'));
            return array_merge($tabs, $newtab);
            }
            add_filter('media_upload_tabs', 'axcoto_genify_media_menu');

           array('genify' => __('Axcoto Genify', 'axcotogenify'));


        function axcoto_genify_media_process() {
        media_upload_header();
        echo 'hello';
        }
        function axcoto_genify_media_menu_handle() {
        return wp_iframe( 'axcoto_genify_media_process');
        }



 if ( ( is_array( $content_func ) && ! empty( $content_func[1] ) && 0 === strpos( (string) $content_func[1], 'media' ) ) || 0 === strpos( $content_func, 'media' ) )
        wp_enqueue_style( 'media' );
sarath
źródło
1
Twój kod jest pełen błędów składniowych. Proszę użyć właściwej składni php, ponieważ składnia, której używasz, nawet nie istnieje w php. Wyjaśnij również, co robi Twój kod i jak działa. Dziękuję
Pieter Goosen
Właśnie edytowałem kod. Jego działający kod. Wypróbuj ten kod.
sarath
2
Przeczytaj ponownie mój komentarz, ale pomiń część składni. Kod zrzutu nie jest dobrą odpowiedzią. Dodaj wyjaśnienie, jak działa Twój kod i co robi
Pieter Goosen