wordpress学习三:wordpress自带的模板学习

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

wordpress学习三:wordpress⾃带的模板学习
在《学习⼆》⾥,⼤概说了下怎么去查找模板,本节我们以⼀个简单的模板为例⼦,继续说说wordpress的模板机制,看看做⼀个⾃⼰的模板需要哪些知识点。

页⾯模板渲染
wordpress的模板位于wp-content/themes⽬录下,wordpress可以⾃动加载新增的模板⽬录。

通过上⼀节的简单介绍,知道wordpress默认打开时会查找home.php或者index.php。

我们先看看wordpress⾃带的模板twentyfifteen的index.php页⾯。

<?php
get_header(); ?>
<div id="primary" class="content-area">
<div id="content" class="site-content" role="main">
<?php if ( have_posts() ) : ?>
<?php /* The loop */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php get_template_part( 'content', get_post_format() ); ?>
<?php endwhile; ?>
<?php twentythirteen_paging_nav(); ?>
<?php else : ?>
<?php get_template_part( 'content', 'none' ); ?>
<?php endif; ?>
</div><!-- #content -->
</div><!-- #primary -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>
这个index.php⾥的代码很简单,只描述了怎么去展⽰⾸页的逻辑。

代码中有get_header(), get_sidebar(), get_footer()三个加载函数,分别加载页⾯的头部,尾部和侧边栏。

⼀般来说,⽹站的这三个部分是公⽤的,所以wordpress抽象了三个函数,来实现代码的重⽤。

以 get_sidebar()的代码为例,看看是如何加载页⾯的不同部分的。

function get_sidebar( $name = null ) {
/**
* Fires before the sidebar template file is loaded.
*
* The hook allows a specific sidebar template file to be used in place of the
* default sidebar template file. If your file is called sidebar-new.php,
* you would specify the filename in the hook as get_sidebar( 'new' ).
*
* @since 2.2.0
* @since 2.8.0 $name parameter added.
*
* @param string $name Name of the specific sidebar file to use.
*/
do_action( 'get_sidebar', $name );
$templates = array();
$name = (string) $name;
if ( '' !== $name )
$templates[] = "sidebar-{$name}.php";
$templates[] = 'sidebar.php';
// Backward compat code will be removed in a future release
if ('' == locate_template($templates, true))
load_template( ABSPATH . WPINC . '/theme-compat/sidebar.php');
}
这个函数默认加载的是sidebar.php⽂件,也可以传⼊不同的$name,来加载sidebar-{$name}.php类型的php⽂件,实现不同的页⾯可以load不同的侧边栏,头部和尾部的代码与侧边栏的代码类似。

wordpress中模板的php⽂件加载均采⽤了类似的罗辑。

除了加载模板的php⽂件,index.php中还调⽤了wordpress中定义的⼀些函数,下⾯我们看看这些函数是⼲什么的。

function have_posts() {
global$wp_query;
return$wp_query->have_posts();
}
$wp_query是在初始化时创建的WP_Query对象;
$GLOBALS['wp_query'] = new WP_Query();
在wp-setting.php中执⾏。

该对象的have_posts()返回当前的url查询罗辑下是否还是需要显⽰的post。

the_post()将全局的$post对象设置为下⼀个选择的post。

function get_template_part( $slug, $name = null ) {
/**
* Fires before the specified template part file is loaded.
*
* The dynamic portion of the hook name, `$slug`, refers to the slug name
* for the generic template part.
*
* @since 3.0.0
*
* @param string $slug The slug name for the generic template.
* @param string $name The name of the specialized template.
*/
do_action( "get_template_part_{$slug}", $slug, $name );
$templates = array();
$name = (string) $name;
if ( '' !== $name )
$templates[] = "{$slug}-{$name}.php";
$templates[] = "{$slug}.php";
locate_template($templates, true, false);
}
上⾯的代码是⼀个通⽤的加载模板php⽂件的函数,类似于get_header,但是⽐他们更通⽤。

通过槽位和name的限定,来实现更灵活的加载模板。

get_template_part( 'content', get_post_format() );
上⾯这⾏代码会加载 content.php模板⽂件,其中包含了⼀个post显⽰的html代码
<?php
/**
* The default template for displaying content
*
* Used for both single and index/archive/search.
*
* @package WordPress
* @subpackage Twenty_Thirteen
* @since Twenty Thirteen 1.0
*/
>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<header class="entry-header">
<?php if ( has_post_thumbnail() && ! post_password_required() && ! is_attachment() ) : ?>
<div class="entry-thumbnail">
<?php the_post_thumbnail(); ?>
</div>
<?php endif; ?>
<?php if ( is_single() ) : ?>
<h1 class="entry-title"><?php the_title(); ?></h1>
<?php else : ?>
<h1 class="entry-title">
<a href="<?php the_permalink(); ?>" rel="bookmark"><?php the_title(); ?></a>
</h1>
<?php endif; // is_single() ?>
<div class="entry-meta">
<?php twentythirteen_entry_meta(); ?>
<?php edit_post_link( __( 'Edit', 'twentythirteen' ), '<span class="edit-link">', '</span>' ); ?>
</div><!-- .entry-meta -->
</header><!-- .entry-header -->
<?php if ( is_search() ) : // Only display Excerpts for Search ?>
<div class="entry-summary">
<?php the_excerpt(); ?>
</div><!-- .entry-summary -->
<?php else : ?>
<div class="entry-content">
<?php
/* translators: %s: Name of current post */
the_content( sprintf(
__( 'Continue reading %s <span class="meta-nav">&rarr;</span>', 'twentythirteen' ),
the_title( '<span class="screen-reader-text">', '</span>', false )
) );
wp_link_pages( array( 'before' => '<div class="page-links"><span class="page-links-title">' . __( 'Pages:', 'twentythirteen' ) . '</span>', 'after' => '</div>', 'link_before' => '<span>', 'link_after' => '</span>' ) );
>
</div><!-- .entry-content -->
<?php endif; ?>
<footer class="entry-meta">
<?php if ( comments_open() && ! is_single() ) : ?>
<div class="comments-link">
<?php comments_popup_link( '<span class="leave-reply">' . __( 'Leave a comment', 'twentythirteen' ) . '</span>', __( 'One comment so far', 'twentythirteen' ), __( 'View all % comments', 'twentythirteen' ) ); ?> </div><!-- .comments-link -->
<?php endif; // comments_open() ?>
<?php if ( is_single() && get_the_author_meta( 'description' ) && is_multi_author() ) : ?>
<?php get_template_part( 'author-bio' ); ?>
<?php endif; ?>
</footer><!-- .entry-meta -->
</article><!-- #post -->
View Code
content.php是页⾯⾥⼀个post的显⽰模板,排版什么的我们先不关⼼,看看⾥⾯⽤到的wordpress的函数。

这些函数主要在post-template.php中the_ID(): echo当前post的id
post_class(): Display the classes for the post div.
the_title: Display or retrieve the current post title with optional content.
the_permalink():Display the permalink for the current post.
the_excerpt():Display the post excerpt.
the_content(): Display the post content.
只列出了⼏个要紧的函数,wordpress就是通过这些⼀个个的代码⽚段,最终拼接出⼀个完整的显⽰页⾯。

页⾯的数据获取
上⾯主要说了在获取数据后,如何⽤数据拼接成⼀个完整的页⾯。

继续来看看数据是如何获取的。

wordpress在query.php⽂件中定以了⼀个WP_Query类,这个类负责对GET和POST请求的参数进⾏解析,维护在⼀个页⾯显⽰周期⾥所需要的数据读取。

封装了基本的数据读
取⼯作。

主要的数据读取在WP_Query的 get_posts()函数中,该函数有⼀千多⾏,主要就是利⽤$wpdb从数据库读取数据,封装到对应的POST对象中。

get_posts()函数可能在在
WP_Query构造时调⽤,主要依赖于是否传⼊了查询字符串。

public function __construct($query = '') {
if ( ! empty($query) ) {
$this->query($query);
}
}
public function query( $query ) {
$this->init();
$this->query = $this->query_vars = wp_parse_args( $query );
return$this->get_posts();
}
WP_Query的 init函数主要建⽴⼀个⼲净的变量环境。

get_posts函数中有⼤量的各种参数的解析罗辑。

WP类的main函数是调⽤页⾯数据的⼊⼝。

其中会建⽴查询字符串,然后调⽤上⾯的query函数来检索相应的post。

打开⾸页是传⼊的查询字符串对象为空。

函数get_posts中会按照查询参数,拼接处要使⽤的sql语句,代码很长,杂,逻辑⽐较多。

拼好字符串后,在⽤$wpdb这个wpdb类实例(wp-db.php⽂件中)来进⾏数据库操作。

这个类中封装了读取mysql的代码。

具体的⽂档可以参看
https:///Function_Reference/wpdb_Class
这个⽂章我⼤概看了下,主要是对mysql的⼀个简单封装。

相关文档
最新文档