链接的文章在正确的轨道上,但我会让它对您更简单……)
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_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;
}
希望有助于解决问题:)