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.