下面是我找到的简单PHP模板系统
类(template.Class.php)
<?
class Template {
public $template;
function load($filepath) {
$this->template = file_get_contents($filepath);
}
function replace($var, $content) {
$this->template = str_replace("#$var#", $content, $this->template);
}
function publish() {
eval("?>".$this->template."<?");
}
}
?>
模板文件(design.html)
此文件将包含网站的设计以及将与内容数据合并的空白字段。
<html>
<head>
<title>#title#</title>
</head>
<body>
<h3>Hello #name#!</h3>
<p>The time is: #datetime#</p>
<? echo "<p>Embedded PHP works too!</p>"; ?>
</body>
</html>
用法(index.php)
现在,我们将创建一个加载模板的脚本,并使用该类合并数据。
<?
include "template.class.php";
$template = new Template;
$template->load("design.html");
$template->replace("title", "My Template Class");
$template->replace("name", "William");
$template->replace("datetime", date("m/d/y"));
$template->publish();
?>
现在来看一个简单的wordpress post循环索引。php
<?php
get_header();
if (have_posts()) :
while (have_posts()) :
the_post();
the_content();
endwhile;
endif;
?>
问题是,如何将上述wordpress循环和顶级PHP模板系统一起使用,这是将html模板转换为wordpress主题。
最合适的回答,由SO网友:fuxia 整理而成
我对你问题的第一个回答是另一个问题:为什么?
PHP是一种模板语言。只有在设计师和程序员有两个截然不同的工作的情况下,才需要这种分离。但是编写WordPress主题的人无论如何都必须了解PHP:只要看看custom header 和background 设置,位于add_theme_support
, wp_enqueue_style
以及PHP、HTML和CSS绑定在一起的类似情况。
要回答问题,请看TwentyEleven’s single.php
. 您可以在其中加载模板引擎:
<?php get_template_part( \'content\', \'single\' ); ?>
您可以使用:
locate_template( \'php/template.class.php\', TRUE, TRUE );
$template = new Template;
$template->load( \'templates/content-single.html\' );
$template->replace( \'title\', get_the_title() );
例如,有些模板函数不是这样构建的
the_content()
: 它不提供仅返回字符串的参数,并更改
get_the_content()
. 因此,只需使用额外的模板引擎即可重写某些函数
对于循环、导航菜单或小部件,更难将逻辑与标记分离。是的,如果有一些分离就好了……但我在WordPress中找不到这样的方法。
SO网友:Bainternet
下面是对类的快速修改,以处理基本循环:
class Template {
public $template;
//new var to hold the loop items
public $loop_items;
//new var to hold loop template
public $loop_template;
function load($filepath) {
$this->template = file_get_contents($filepath);
$this->loop_template = substr($this->template, strlen("#Loop_Start#")+strpos($this->template, "#Loop_Start#"), (strlen($this->template) - strpos($this->template, "#Loop_End#"))*(-1));
$this->loop_items = array();
}
function replace($var, $content) {
$this->template = str_replace("#$var#", $content, $this->template);
}
//store item from loop
function do_loop(){
if (have_posts()){
while (have_posts()){
the_post();
$this->loop_items[] = array(\'title\' => get_the_title(), \'content\' => apply_filters("the_content",get_the_content()));
}
}else{
$this->loop_items[] = array("title" => "Not Found", \'content\' => "Sorry, nothing found");
}
}
function replace_loop(){
$loop_html = \'\';
foreach($this->loop_items as $key -> $arr){
$temp = str_replace("#loop_title#",$arr[\'title\'],$this->loop_template);
$temp = str_replace("#loop_content#",$arr[\'content\'],$temp);
$loop_html .= $temp;
}
$this->template = str_replace($this->loop_template,$loop_html,$this->template);
}
function publish() {
eval("?>".$this->template."<?");
}
}
现在只需确保您的html具有以下标记:
#Loop_Start#
- 放置在循环模板之前#Loop_End#
- 放置在循环模板之后#loop_title#
- 将项目标题放置在循环模板中所需的位置#loop_content#
- 将项目内容放置在循环模板中所需的位置例如:<html>
<head>
<title>#title#</title>
</head>
<body>
#Loop_Start#
<h3>Hello #loop_title#</h3>
<p>#loop_content#</p>
<? echo "<p>Embedded PHP works too!</p>"; ?>
#Loop_End#
</body>
</html>
你应该这样称呼它:include "template.class.php";
$template = new Template;
$template->load("design.html");
$template->replace("title", "My Template Class");
$template->do_loop();
$template->replace_loop();
$template->publish();