user
  • 0
Гуру

Добавить страницу пользовательского шаблона программно

  • 0

Я пытаюсь добавить страницу шаблона из плагина, и моя страница шаблона находится в этой папке плагина. Возможно ли это? Вот мой код:

 global $user_ID;
    $new_post = array(
        'post_title' => 'Test Template Page',
        'post_content' => 'Some text',
        'post_status' => 'publish',
        'post_date' => date('Y-m-d H:i:s'),
        'post_author' => $user_ID,
        'post_type' => 'page',
        'post_category' => array(0)
    );
    $post_id = wp_insert_post($new_post);
    if (!$post_id) {
        wp_die('Error creating template page');
    } else {
        update_post_meta($post_id, '_wp_page_template', 'tp-file.php');
    }

tp-file.php — моя пользовательская страница шаблона. Когда я помещаю этот файл в папку моей темы, он работает нормально, но я хочу сделать это с файлом из папки плагина, поэтому мне не нужно заставлять пользователей копировать это файл из папки плагина в папку шаблона. Возможно ли это? Любая идея?

Share
  1. unfocus.com/2010/08/10/… Кажется, решает эту проблему. Я не очень хорошо знаком с этим, поэтому я не могу сказать, работает ли он или нет.

    • 0
  2. Связанная статья находится на правильном пути, но я сделаю ее более простой для вас.. 😉

    add_filter( 'page_template', 'catch_plugin_template' );
    
    function catch_plugin_template( $template ) {
        if( 'tp-file.php' == basename( $template ) )
            $template = WP_PLUGIN_DIR . '/yourpluginname/tp-file.php';
        return $template;
    }
    

    Фильтр в основном смотрит, установлен ли ваш специальный шаблон страницы для текущей страницы, если это так, обновляет путь, чтобы вместо этого указать на ваш шаблон плагинов.

    Просто убедитесь, что путь правильный, иначе вы увидите ошибки включения… 🙂

    Продолжение №1

    Хорошо, первая проблема заключается в том, что WordPress проверяет любой набор шаблонов как шаблон страницы, т.е. он проверяет, находится ли файл в папке темы и является ли он допустимым файлом шаблона, если нет, он пропускает его и включает более общий шаблон, например page.php…

    Однако это не меняет того факта, что метаполе по-прежнему содержит значение вашего пользовательского шаблона, а также is_page_template( 'tp-file.php' ) будет правильно возвращать значение true, если оно используется вместо моего предыдущего условного оператора, например..

    // Filter page template
    add_filter('page_template', 'catch_plugin_template');
    
    // Page template filter callback
    function catch_plugin_template($template) {
        // If tp-file.php is the set template
        if( is_page_template('tp-file.php') )
            // Update path(must be path, use WP_PLUGIN_DIR and not WP_PLUGIN_URL) 
            $template = WP_PLUGIN_DIR . '/tp-test/tp-file.php';
        // Return
        return $template;
    }
    

    ПРИМЕЧАНИЕ. Я переключил код на использование WP_PLUGIN_DIR, поскольку WP_PLUGIN_URL константа не подходит для путей… (включает в себя должен использовать путь, а не URL-адрес).

    Одна проблема, и это действительно не то, что вы можете исправить, заключается в том, что при просмотре страницы из области администратора при редактировании страницы шаблон не будет указан как активный шаблон, и сохранение изменений, конечно, может изменить активный шаблон. Там мы можем многое сделать, раскрывающийся список шаблонов страниц генерируется из функции, которая сканирует файлы темы, я не вижу никаких хуков, которые позволили бы нам расширить список с помощью шаблонов плагинов.

    Лично я бы предложил в качестве обходного пути сохранить дополнительное метаполе на каждой странице, созданной с использованием вашей специальной страницы плагина, затем добавить крючок save_post или wp_insert_post_data и проверить, существует ли это метаполе, если оно существует, также проверьте, что для шаблона страницы задано значение tp-file.php, а если нет, обновите его до tp-file.php . Дополнительное мета-поле будет, так сказать, просто флагом, указывающим, к каким страницам необходимо прикрепить шаблон вашего плагина.

    Вот ваш плагин работает в самой простой форме (да, я проверял)… 🙂

    <?php
    /*
      Plugin Name: TP Test Plugin
      Plugin URI: 
      Description: TP Test Plugin
      Version: 1.0.0
      Author: 
      Author URI: 
    */
    
    global $wp_version;
    
    if( version_compare( $wp_version, "2.9", "<" ) )
        exit( 'This plugin requires WordPress 2.9 or newer. <a href="http://codex.wordpress.org/Upgrading_WordPress">Please update!</a>' );
    
    // Add callback to admin menu
    add_action('admin_menu', 'create_tp_menu');
    
    // Callback to add menu items
    function create_tp_menu() {
        add_management_page('TP Test', 'TP Test', 'manage_options', 'tp-teste', 'wp_tp_test_fnc' );
    }
    
    function wp_tp_test_fnc() {
    
        //include('tp-form-file.php');
    
        if( !empty( $_POST['tp_name'] ) ) {
            $tp_name = $_POST['tp_name'];
    
            global $user_ID;
            $new_post = array(
                'post_title' => $tp_name,
                'post_content' => 'Some text',
                'post_status' => 'publish',
                'post_date' => date('Y-m-d H:i:s'),
                'post_author' => $user_ID,
                'post_type' => 'page',
            );
            $post_id = wp_insert_post($new_post);
    
            if( !$post_id )
                wp_die('Error creating template page');
            else
                update_post_meta( $post_id, '_wp_page_template', 'tp-file.php' );
            /*
            $pt = get_page_templates();
    
            $pt['TP file test'] = WP_PLUGIN_URL . '/tp-test/tp-file.php';
    
            echo "<pre>";
            print_r($pt);
            echo "</pre>";
            */
        }   
        ?>
        <fieldset style="margin: 50px 100px;background-color: #cccccc;padding: 30px;border: 1px solid #ccc">
             <legend style="background-color: #ccccff;padding: 20px;font-weight: bold;font-size: 18px">Create Template Page</legend>
             <form name="frm_main" action="" method="POSt">
                  <input class="text" type="text" name="tp_name" size="50" />
                  <br />
                  <input class="button" type="submit" value="Create Template Page" name="btn_submit" />
             </form>
        </fieldset>
        <?php
    
    }
    
    
    // Filter page template
    add_filter('page_template', 'catch_plugin_template');
    
    // Page template filter callback
    function catch_plugin_template($template) {
        // If tp-file.php is the set template
        if( is_page_template('tp-file.php') )
            // Update path(must be path, use WP_PLUGIN_DIR and not WP_PLUGIN_URL) 
            $template = WP_PLUGIN_DIR . '/tp-test/tp-file.php';
        // Return
        return $template;
    }
    

    Надеюсь, это поможет прояснить ситуацию.. 🙂

    • 0
  3. Сейчас page_template фильтр устарел. ( http://adambrown.info/p/wp_hooks/hook/page_template )

    Попробуйте вместо этого использовать single_template (или archive_template для архивных шаблонов).

    На основе ответа @ t31os:

    // Filter page template
    add_filter('single_template', 'catch_plugin_template');
    
    // Page template filter callback
    function catch_plugin_template($template) {
        // If tp-file.php is the set template
        if( is_page_template('tp-file.php') )
            // Update path(must be path, use WP_PLUGIN_DIR and not WP_PLUGIN_URL) 
            $template = WP_PLUGIN_DIR . '/tp-test/tp-file.php';
        // Return
        return $template;
    }
    
    • 0

Оставить ответ

You must login to add an answer.