用于WordPress主题开发的PHP模板编码方式

时间:2012-03-23 作者:pandu

下面是我找到的简单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主题。

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

我对你问题的第一个回答是另一个问题:为什么?

PHP是一种模板语言。只有在设计师和程序员有两个截然不同的工作的情况下,才需要这种分离。但是编写WordPress主题的人无论如何都必须了解PHP:只要看看custom headerbackground 设置,位于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();
    

结束

相关推荐