php 从插件中加载自定义页面模板

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php 从插件中加载自定义页面模板相关的知识,希望对你有一定的参考价值。

<?php

/**
 * Class Custom_Page_Templates
 */
class Custom_Page_Templates {

	/**
	 * Storage for all custom template paths
	 *
	 * @var array
	 */
	protected static $_paths = array();

	/**
	 * Add actions and filters
	 */
	public static function initialize() {
		add_action( 'load-post.php', array( __CLASS__, 'register_templates' ) );
		add_filter( 'template_include', array( __CLASS__, 'load_template' ) );
	}

	/**
	 * Register a custom template path
	 *
	 * @param string $path
	 */
	public static function register_path( $path ) {
		self::$_paths[] = $path;
	}

	/**
	 * Register custom templates
	 */
	public static function register_templates() {
		$theme = wp_get_theme();
		$templates = array_merge( $theme->get_page_templates(), self::get_custom_templates() );
		$cache_hash = md5( $theme->get_theme_root() . '/' . $theme->get_stylesheet() );
		wp_cache_set( "page_templates-{$cache_hash}", $templates, 'themes', 1800 );
	}

	/**
	 * Handle loading of custom template
	 *
	 * @param string $template
	 * @return string $template
	 */
	public static function load_template( $template ) {
		$custom_template = get_post_meta( get_the_ID(), '_wp_page_template', true );
		if ( ! empty( $custom_template ) && array_key_exists( $custom_template, self::get_custom_templates() ) ) {
			$template = $custom_template;
		}
		return $template;
	}

	/**
	 * Get custom templates
	 *
	 * @return array $templates
	 */
	public static function get_custom_templates() {
		static $templates = array();
		if ( empty( $templates ) && ! empty( self::$_paths ) ) {
			foreach ( self::$_paths as $path ) {
				$directory = new \RecursiveDirectoryIterator( $path );
				$iterator = new \RecursiveIteratorIterator( $directory );
				$regex = new \RegexIterator( $iterator, '/^.+\.php$/i', \RecursiveRegexIterator::GET_MATCH );
				foreach ( $regex as $file => $matches ) {
					$file_data = get_file_data( $file, array( 'name' => 'Template Name' ), 'page-templates' );
					if ( ! empty( $file_data['name'] ) ) {
						$templates[$file] = $file_data['name'];
					}
				}
			}
		}
		return $templates;
	}

}

以上是关于php 从插件中加载自定义页面模板的主要内容,如果未能解决你的问题,请参考以下文章

Django:在使用模板继承时在基本模板文件中加载自定义过滤器时出现问题

如何从文件中加载自定义 Django 标签?

如何从资源中加载自定义字体? [C#]

使用Google Colab时如何从Google drive中加载自定义的包模型和数据集

使用Google Colab时如何从Google drive中加载自定义的包模型和数据集

在使用 Visual Studio 2017 和 boost 构建的 python 中加载自定义 dll 时出现依赖错误