Чи існує плагін WordPress, який реєструє файл плагіна як шаблон користувальницької сторінки?


9

Мені потрібно створити плагін, який робить власні шаблони сторінок доступними у wp-admin. Мені цікаво, чи хтось уже вирішив це, як це здається досить типовим процесом?


Я не зовсім розумію питання. Ви хочете плагін, який вставляє власні шаблони, визначені в плагіні?
Стівен

Відповіді:


7

Як відповів Рарст, ви дійсно можете це зробити, не редагуючи основні файли або видаляючи метабокс атрибутів сторінки та створюючи свій додаток за допомогою того самого коду з невеликою модифікацією. приведений нижче код - це код для /admin/include/meta-boxes.php, і я додав коментар, щоб показати, куди відправлятимуться ваші додаткові параметри шаблону сторінки:

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
}

Не знаю, чи це виправлення у вашому випадку, але у мене був невдалий випадок, коли мені потрібно було відобразити тип публікації у вбудованій темі для плагінів, і для цього я використовував add_filter('the_content', 'my-function'); і моя функція створювала вихід для відображення.

Іншим варіантом було б змусити ваш плагін створити файл шаблону в поточному каталозі тем приблизно таким чином:

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

і ви можете запустити це після першого перевірки, чи існує файл

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

Сподіваюся, що одне з цього допомагає.


Буде тестувати мета-матеріали, шина відповідно до моєї відповіді - це лише частина випуску, інше - код, який намагається завантажити шаблон, лише якщо він знаходиться в каталозі тем. Тому надання "зовнішнього" шаблонного файлу може бути недостатньо для завантаження.
Рарст

ось чому я запропонував плагіну створити файли в каталозі теми.
Bainternet

2

Я не зовсім впевнений, що я розумію, чого ви намагаєтесь досягти, принаймні, чому б ви хотіли, щоб плагін це робив.

Нормальна процедура створення різних шаблонів сторінок:

  1. Створіть новий шаблон сторінки у своєму тематичному каталозі АКТИВНО (зробіть копію page.php).

  2. Змініть назву шаблону (всередині файлу).

    / * Назва шаблону: Сторінка повної ширини * /

  3. Змініть код сторінки на те, чого ви намагаєтеся досягти.

  4. Тепер ви можете перейти до створення нової сторінки та вибрати, який "Шаблон" використовувати.

alt текст

...

Я сподіваюся, що саме цього ви намагаєтесь досягти?

Офіційна документація тут: http://codex.wordpress.org/Pages#Creating_Your_Own_Page_Templates


Вупи. зразок PHP-коду трохи заплутаний. Перейдіть за посиланням для правильного прикладу коду.
Ларс Кудал

2
Цікаво дізнатися, чи хтось використовує метод Яна в існуючому плагіні: wordpress.stackexchange.com/questions/3396/…
jnthnclrk

Я вважаю, що @trnsfrmr шукає спосіб, як створити заздалегідь визначений шаблон сторінки (кроки 1-3) всередині власного плагіна, щоб зробити цей шаблон доступним для користувачів після активації плагіна. Я думаю, що він хоче зберегти цю тему рішення незалежною.
Міхал Мау

Ага, добре, я трохи не зрозумів там, дякую за уточнення :-)
Ларс Кудал

2

Це, здається, досить важко досягти. get_page_templates()Функція активно відкидає все, що не знаходиться в батьківських та дочірніх кореневих каталогах. Він також не зберігається в глобальній змінній і не дозволяє фільтрувати створений список шаблонів.

Я думаю, що мета-поле атрибутів сторінки потрібно буде роздвоювати та повністю замінити для цього. І не впевнений, що це буде можливо навіть тоді.

Я погоджуюся, що це здається чимось, що має сенс, але код WordPress дуже точний тим, що він хоче, щоб названі шаблони надходили лише з каталогу теми.


1

Хіба це не є однією з причин, що register_theme_directory()були представлені?

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

У той час це було питання, пов’язане з BuddyPress, який хотів підкинути зайві шаблони тут і там.

Я вважаю, що вони не вказані належним чином як шаблони сторінок:

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


Я перейду код (можливо, завтра), але наскільки я пам’ятаю, шаблони з іменами явно шукаються лише через константи шляху.
Рарст
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.