Czy istnieje wtyczka WordPress, która rejestruje plik wtyczki jako niestandardowy szablon strony?


9

Muszę utworzyć wtyczkę, która udostępnia niestandardowe szablony stron w wp-admin. Zastanawiam się, czy ktoś już się tym zajął, ponieważ wydaje się to dość typowym procesem?


Nie do końca rozumiem pytanie. Chcesz wtyczki, która wstawia niestandardowe szablony zdefiniowane we wtyczce?
— Steven

Odpowiedzi:


7

Tak jak odpowiedział Rarst, naprawdę możesz to zrobić bez edycji podstawowych plików lub usunięcia metaboksu atrybutów strony i stwórz swój przy użyciu tego samego kodu z niewielką modyfikacją. poniższy kod to kod pliku /admin/include/meta-boxes.php, a ja dodałem komentarz, aby pokazać, gdzie pójdą dodatkowe opcje szablonu strony:

function page_attributes_meta_box($post) {
    $post_type_object = get_post_type_object($post->post_type);
    if ( $post_type_object->hierarchical ) {
        $pages = wp_dropdown_pages(array('post_type' => $post->post_type, 'exclude_tree' => $post->ID, 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
        if ( ! empty($pages) ) {
        ?>
        <p><strong><?php _e('Parent') ?></strong></p>
        <label class="screen-reader-text" for="parent_id"><?php _e('Parent') ?></label>
        <?php echo $pages; ?>
        <?php
        } // end empty pages check
    } // end hierarchical check.
    if ( 'page' == $post->post_type && 0 != count( get_page_templates() ) ) {
        $template = !empty($post->page_template) ? $post->page_template : false;
        ?>
        <p><strong><?php _e('Template') ?></strong></p>
        <label class="screen-reader-text" for="page_template"><?php _e('Page Template') ?></label><select name="page_template" id="page_template">
        <option value='default'><?php _e('Default Template'); ?></option>
        <?php page_template_dropdown($template); ?>

        // add your page templates as options

        </select>
        <?php
    } ?>
    <p><strong><?php _e('Order') ?></strong></p>
    <p><label class="screen-reader-text" for="menu_order"><?php _e('Order') ?></label><input name="menu_order" type="text" size="4" id="menu_order" value="<?php echo esc_attr($post->menu_order) ?>" /></p>
    <p><?php if ( 'page' == $post->post_type ) _e( 'Need help? Use the Help tab in the upper right of your screen.' ); ?></p>
    <?php
}

Nie wiem, czy jest to poprawka w twoim przypadku, ale miałem skrzynkę ze smilerem, gdy potrzebowałem wyświetlić typ postu we wbudowanym motywie wtyczki i do tego użyłem, add_filter('the_content', 'my-function'); a moja funkcja utworzyła wyjście do wyświetlenia.

Inną opcją byłoby spowodowanie, aby wtyczka utworzyła plik szablonu w bieżącym katalogu motywów, mniej więcej tak:

function create_plugins_theme_file(){
    $file_name = TEMPLATEPATH . '/' . $tamplate_name . '.php';
    $handle = fopen($file_name, 'w') or wp_die('Cannot open file for editing');
    $file_contents = <<<OUT
<?php
/*
Template Name: $tamplate_name
*/
?>

//you theme file here

OUT;

   fwrite($handle, $file_contents);
   fclose($handle);
 }

i możesz to uruchomić po pierwszym sprawdzeniu, czy plik istnieje

if(!file_exists( $file_name)){create_plugins_theme_file();}

Mam nadzieję, że jedno z nich pomaga.


Przetestuję rzeczy z meta-boxami, magistrala zgodnie z moją odpowiedzią - to tylko część problemu, innym jest - kod, który próbuje załadować szablon tylko, jeśli jest w katalogu motywów. Podanie pliku szablonu „zewnętrznego” może być niewystarczające, aby go załadować.
— Rarst

dlatego zaproponowałem, aby wtyczka utworzyła pliki w katalogu motywu.
— Bainternet,

2

Nie jestem do końca pewien, czy rozumiem, co próbujesz osiągnąć, a przynajmniej dlaczego chcesz, aby wtyczka to zrobiła.

Normalna procedura tworzenia różnych szablonów stron to:

  1. Utwórz nowy szablon strony w katalogu motywów ACTIVE (zrób kopię page.php).

  2. Zmień nazwę szablonu (w pliku).

    / * Nazwa szablonu: Strona o pełnej szerokości * /

  3. Zmień kod strony na to, co próbujesz osiągnąć.

  4. Możesz teraz utworzyć nową stronę i wybrać, którego „szablonu” użyć.

alternatywny tekst

...

Mam nadzieję, że właśnie to próbujesz osiągnąć?

Oficjalna dokumentacja tutaj: http://codex.wordpress.org/Pages#Creating_Your_Own_Page_Templates


Woops. przykładowy kod PHP jest trochę pomieszany. Przejdź do linku, aby znaleźć właściwy przykład kodu
— Lars Koudal

2
Chcesz wiedzieć, czy ktoś korzysta z metody Jana w istniejącej wtyczce: wordpress.stackexchange.com/questions/3396/…
— jnthnclrk

Wierzę, że @trnsfrmr szuka sposobu, jak utworzyć wstępnie zdefiniowany szablon strony (kroki 1-3) we własnej wtyczce, aby udostępnić ten szablon użytkownikom po aktywacji wtyczki. Przypuszczam, że chce zachować niezależność tego rozwiązania.
— Michał Mau

Ach, dobra, trochę tam źle zrozumiałem, dziękuję za wyjaśnienie :-)
— Lars Koudal

2

Wydaje się to dość trudne do osiągnięcia. get_page_templates()funkcja aktywnie odrzuca wszystko, co nie znajduje się w katalogach głównych nadrzędnych i podrzędnych. Nie zapisuje również w zmiennej globalnej ani nie pozwala na filtrowanie wygenerowanej listy szablonów.

Sądzę, że meta box atrybuty strony będzie wymagał rozwidlenia i całkowitego zastąpienia. I nie jestem pewien, czy to będzie możliwe nawet wtedy.

Zgadzam się, że wydaje się to mieć sens, ale kod WordPress jest bardzo precyzyjny, ponieważ chce, aby nazwane szablony pochodziły tylko z katalogu motywu.


1

Czy to nie jeden z powodów, które register_theme_directory()zostały wprowadzone?

http://core.trac.wordpress.org/ticket/10467

W tym czasie był to problem związany z BuddyPress, który chciał wrzucić tu i tam dodatkowe szablony.

Rozumiem, że nie są one poprawnie wymienione jako szablony stron, jednak:

http://core.trac.wordpress.org/ticket/15803


Przejdę do kodu (prawdopodobnie jutro), ale o ile pamiętam szablony z nazwami są wyraźnie wyszukiwane tylko przez stałe ścieżki.
— Rarst
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.