• wordpress学习二:源码目录结构和启动流程


    wordpress安装后的文件目录如下:

    其中的主要目录和文件用途介绍如下:

    wp-admin:用于进行博客后台设置的功能目录

    wp-content: wordpress的 主题,插件和本地化的存储目录

    wp-include: wordpress一些类和公共函数文件的存放目录。

    根目录下的index.php是大部分wordpress功能的入口模块。

    大概看了一下入口代码的调用关系,画图如下:

    上图中只绘制了主要的流程。流程主要分为三个部分,分别是全局的初始化,数据读取和模板渲染。 

    wp-load.php中进行了一串的函数调用,定了了全局变量,引用必要的php文件。

    wp()函数主要调用wp-include/class-wp.php中的类方法,实现不同请求的预处理,加载对应的数据到全局对象中,以后后续的模板页面来展示。

    template-loader.php中实现按照不同的url参数,来加载不同的模板。

     先熟悉下模板的加载流程:

    $template = false;
        if     ( is_404()            && $template = get_404_template()            ) :
        elseif ( is_search()         && $template = get_search_template()         ) :
        elseif ( is_front_page()     && $template = get_front_page_template()     ) :
        elseif ( is_home()           && $template = get_home_template()           ) :
        elseif ( is_post_type_archive() && $template = get_post_type_archive_template() ) :
        elseif ( is_tax()            && $template = get_taxonomy_template()       ) :
        elseif ( is_attachment()     && $template = get_attachment_template()     ) :
            remove_filter('the_content', 'prepend_attachment');
        elseif ( is_single()         && $template = get_single_template()         ) :
        elseif ( is_page()           && $template = get_page_template()           ) :
        elseif ( is_category()       && $template = get_category_template()       ) :
        elseif ( is_tag()            && $template = get_tag_template()            ) :
        elseif ( is_author()         && $template = get_author_template()         ) :
        elseif ( is_date()           && $template = get_date_template()           ) :
        elseif ( is_archive()        && $template = get_archive_template()        ) :
        elseif ( is_comments_popup() && $template = get_comments_popup_template() ) :
        elseif ( is_paged()          && $template = get_paged_template()          ) :
        else :
            $template = get_index_template();
        endif;
    
        if ( $template = apply_filters( 'template_include', $template ) )
            include( $template );
        return;

    以上代码很清楚能看出根据不同的页面类型,加载不同的模板php文件。上面代码中的get_home_template函数定义如下: 

    function get_home_template() {
    	$templates = array( 'home.php', 'index.php' );
    	return get_query_template( 'home', $templates );
    }
    

      上面代码可以看出默认的home页面会加载的页面是home.php或者index.php文件.

    get_query_template能够获取到指定类型的模板文件路径。

    function get_query_template( $type, $templates = array() ) {
    	$type = preg_replace( '|[^a-z0-9-]+|', '', $type );
    
    	if ( empty( $templates ) )
    		$templates = array("{$type}.php");
    
    	$template = locate_template( $templates );
    	/**
    	 * Filter the path of the queried template by type.
    	 *
    	 * The dynamic portion of the hook name, `$type`, refers to the filename
    	 * -- minus the extension -- of the file to load. This hook also applies
    	 * to various types of files loaded as part of the Template Hierarchy.
    	 *
    	 * @since 1.5.0
    	 *
    	 * @param string $template Path to the template. See {@see locate_template()}.
    	 */
    	return apply_filters( "{$type}_template", $template );
    }
    

      locate_template函数判断出对应的模板文件是否存在,如果存在,$load为真时加载对应的模板文件,否则仅仅是返回模板文件的路径。

    function locate_template($template_names, $load = false, $require_once = true ) {
    	$located = '';
    	foreach ( (array) $template_names as $template_name ) {
    		if ( !$template_name )
    			continue;
    		if ( file_exists(STYLESHEETPATH . '/' . $template_name)) {
    			$located = STYLESHEETPATH . '/' . $template_name;
    			break;
    		} elseif ( file_exists(TEMPLATEPATH . '/' . $template_name) ) {
    			$located = TEMPLATEPATH . '/' . $template_name;
    			break;
    		}
    	}
    
    	if ( $load && '' != $located )
    		load_template( $located, $require_once );
    
    	return $located;
    }
    

     上面的几个函数主要是选择哪个模板,模板路径如何得来,加载的过程展示。有了这些代码的基础,我们对url的不同参数,应该出什么模板,对应的模板应该找什么php文件,就很清楚了。后面我们讲到模板的编写时候,也会有对应的模板加载相关的内容。

      

  • 相关阅读:
    [CareerCup] 4.6 Find Next Node in a BST 寻找二叉搜索树中下一个节点
    Android 接入支付宝支付实现
    Android 设置软键盘搜索键以及监听搜索键点击事件
    Android 应用监听自身卸载,弹出用户反馈调查
    ndk制作so库,ndk-build不是内部或外部命令。。。的错误
    Error: Your project contains C++ files but it is not using a supported native build system
    Android开发之——依赖冲突Program type already present
    基于Python的开源人脸识别库:离线识别率高达99.38%
    Android5.0以后,materialDesign风格的加阴影和裁剪效果
    Android 5.0 以上监听网络变化
  • 原文地址:https://www.cnblogs.com/kwliu/p/4596329.html
Copyright © 2020-2023  润新知