Есть ли плагин WordPress, который регистрирует файл плагина в качестве пользовательского шаблона страницы?

9

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

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

Ответы:

7

Как ответил Rarst, вы действительно можете сделать это без редактирования основных файлов или удаления метабокса атрибутов страницы и создать свой код, используя тот же код с небольшой модификацией. приведенный ниже код является кодом для /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'); и 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
источник
Будет тестировать содержимое мета-блока, шина согласно моему ответу - это только часть проблемы, другой - код, который пытается загрузить шаблон, только если он находится в каталоге темы. Таким образом, предоставление «внешнего» файла шаблона может быть недостаточным для его загрузки.
Rarst
Вот почему я предложил сделать плагин для создания файлов в каталоге темы.
Bainternet
2

Я не совсем уверен, что понимаю, чего вы пытаетесь достичь, по крайней мере, почему вы хотите, чтобы плагин делал это.

Обычная процедура для создания различных шаблонов страниц:

  1. Создайте новый шаблон страницы в директории вашей темы ACTIVE (сделайте копию page.php).

  2. Измените название шаблона (внутри файла).

    / * Имя шаблона: Страница полной ширины * /

  3. Измените код страницы на то, что вы пытаетесь достичь.

  4. Теперь вы можете создать новую страницу и выбрать «Шаблон» для использования.

альтернативный текст

...

Я надеюсь, что это то, что вы пытаетесь достичь?

Официальная документация здесь: http://codex.wordpress.org/Pages#Creating_Your_Own_Page_Templates

Ларс Коудал
источник
Woops. Пример кода PHP немного испорчен. Посетите ссылку для правильного примера кода.
Ларс Коудал
2
Интересно узнать, использует ли кто-нибудь метод Яна в существующем плагине: wordpress.stackexchange.com/questions/3396/…
jnthnclrk
Я считаю, что @trnsfrmr ищет способ создания предварительно определенного шаблона страницы (шаги 1-3) внутри своего собственного плагина, чтобы сделать этот шаблон доступным для пользователей после активации плагина. Я предполагаю, что он хочет сохранить эту тему решения независимой.
Михал Мау
Ах, хорошо, я немного не понял там, спасибо за разъяснения :-)
Ларс Кудал
2

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

Я думаю, что мета-поле атрибутов страницы нужно будет разветвить и полностью заменить для этого. И не уверен, что это будет возможно даже тогда.

Я согласен, что это похоже на то, что имеет смысл, но код WordPress очень точен в том, что он хочет, чтобы именованные шаблоны приходили только из каталога темы.

Rarst
источник
1

Разве это не одна из причин, которые register_theme_directory()были введены?

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

В то время это была проблема, связанная с BuddyPress, который хотел добавить дополнительные шаблоны здесь и там.

Я полагаю, что они не перечислены в качестве шаблонов страниц, хотя:

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

Дени де Бернарди
источник
Я рассмотрю код (вероятно, завтра), но, насколько я помню, шаблоны с именами явно просматриваются только через константы пути.
Rarst