以编程方式添加自定义模板页面

时间:2011-03-29 作者:user1147

我正在尝试从插件添加模板页面,我的模板页面位于该插件文件夹中。这可能吗?这是我的代码:

 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文件。php是我的自定义模板页面。当我把那个文件放进我的主题文件夹时,它工作得很好,但我想用插件文件夹中的文件这样做,这样我就不必强迫用户将那个文件从插件文件夹复制到模板文件夹。这可能吗?有什么想法吗?

3 个回复
最合适的回答,由SO网友:t31os 整理而成

链接的文章在正确的轨道上,但我会让它对您更简单……)

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会验证任何设置为页面模板的模板,即它会检查文件是否在主题文件夹中,是否是有效的模板文件,如果不在主题文件夹中,它会跳过该文件,并包括一个更通用的模板,如页面。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;
}
NOTE: 我已将代码切换为使用WP_PLUGIN_DIR 作为WP_PLUGIN_URL 常数不适用于paths... (包括必须使用路径,而不是URL)。

一个问题是,当从管理区域查看页面时,当编辑页面时,模板不会被列为活动模板,保存更改当然会更改活动模板,但这确实不是您可以解决的问题。我们可以做很多事情,页面模板下拉列表是从一个扫描主题文件的函数生成的,我看不到有任何挂钩可以让我们用插件模板扩展列表。

我个人的建议是,作为一种解决方法,在使用特殊插件页面创建的每个页面中保存一个额外的元字段,然后在save_postwp_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;
}
希望有助于解决问题:)

SO网友:docker

这个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;
}

SO网友:VangelisG

一个问题是,当从管理区域查看页面时,当编辑页面时,模板不会列为活动模板,保存更改当然会更改活动模板,但这确实不是您可以解决的问题。我们可以做很多事情,页面模板下拉列表是从一个扫描主题文件的函数生成的,我看不到允许我们使用插件模板扩展列表的挂钩。

事实上,我在另一根线上发现了一个钩子,它正是这样做的:

WordPress: Can you programmatically create page templates?

为了方便起见,我将代码粘贴在此处:

CONST CUSTOM_PAGE_TEMPLATES = array(
  array(\'slug\' => \'home\', \'label\' => \'Home\'),
  array(\'slug\' => \'content-page\', \'label\' => \'Content Page\'),
  array(\'slug\' => \'ordering\', \'label\' => \'Ordering\'),
  array(\'slug\' => \'reviews\', \'label\' => \'Reviews\')
); 

/**
 * Add file-less page templates to the page template dropdown 
 */
add_filter(\'theme_page_templates\', function($page_templates, $wp_theme, $post) {
  foreach(CUSTOM_PAGE_TEMPLATES as $template) {
    // Append if it doesn\'t already exists
    if (!isset($page_templates[$template[\'slug\']])) {
      $page_templates[$template[\'slug\']] = $template[\'label\'];
    }
  }
  return $page_templates;
}, PHP_INT_MAX, 3);
希望这能帮助别人。

结束

相关推荐

获取在Functions.php中设置的变量,并在我的Custom Post模板中回显它们

在我的函数中设置了以下函数。php文件,以允许我的自定义帖子类型“Slideshow”工作。add_action( \'the_post\', \'paginate_slide\' ); function paginate_slide( $post ) { global $pages, $multipage, $numpages; if( is_single() && get_post_type() == \'lom_s