/ Wordpress / Шаблон страницы из плагина

Шаблон страницы из плагина

HIT

04.01.2019

1645

Обычным способом добавить шаблон страницы или записи из плагина не получится. Для этого нужно создать класс:

// Add page template
class PageTemplater {

	private static $instance; // A reference to an instance of this class.

	protected $templates; // The array of templates that this plugin tracks.

	public static function get_instance() { // Returns an instance of this class. 

		if ( null == self::$instance ) {
			self::$instance = new PageTemplater();
		} 

		return self::$instance;

	} 

	private function __construct() { // Initializes the plugin by setting filters and administration functions.

		$this->templates = array();

		// Add a filter to the attributes metabox to inject template into the cache.
		if ( version_compare( floatval( get_bloginfo( 'version' ) ), '4.7', '<' ) ) {

			// 4.6 and older
			add_filter(
				'page_attributes_dropdown_pages_args',
				array( $this, 'register_project_templates' )
			);

		} else {

			// Add a filter to the wp 4.7 version attributes metabox
			add_filter(
				'theme_page_templates', array( $this, 'add_new_template' )
			);

		}

		// Add a filter to the save post to inject out template into the page cache
		add_filter(
			'wp_insert_post_data', 
			array( $this, 'register_project_templates' ) 
		);


		// Add a filter to the template include to determine if the page has our 
		// template assigned and return it's path
		add_filter(
			'template_include', 
			array( $this, 'view_project_template') 
		);


		// Add your templates to this array.
		$this->templates = array(
			'template-setquantity.php' => 'Request template for Set Quantity',
		);
			
	} 

	// Adds our template to the page dropdown for v4.7+
	public function add_new_template( $posts_templates ) {
		$posts_templates = array_merge( $posts_templates, $this->templates );
		return $posts_templates;
	}

	// Adds our template to the pages cache in order to trick WordPress
	// into thinking the template file exists where it doens't really exist.
	public function register_project_templates( $atts ) {

		// Create the key used for the themes cache
		$cache_key = 'page_templates-' . md5( get_theme_root() . '/' . get_stylesheet() );

		// Retrieve the cache list. 
		// If it doesn't exist, or it's empty prepare an array
		$templates = wp_get_theme()->get_page_templates();
		if ( empty( $templates ) ) {
			$templates = array();
		} 

		// New cache, therefore remove the old one
		wp_cache_delete( $cache_key , 'themes');

		// Now add our template to the list of templates by merging our templates
		// with the existing templates array from the cache.
		$templates = array_merge( $templates, $this->templates );

		// Add the modified cache to allow WordPress to pick it up for listing
		// available templates
		wp_cache_add( $cache_key, $templates, 'themes', 1800 );

		return $atts;

	} 

	// Checks if the template is assigned to the page
	public function view_project_template( $template ) {
		
		global $post; // Get global post

		if ( ! $post ) { // Return template if post is empty
			return $template;
		}

		// Return default template if we don't have a custom one defined
		if ( ! isset( $this->templates[get_post_meta( 
			$post->ID, '_wp_page_template', true 
		)] ) ) {
			return $template;
		} 

		$file = plugin_dir_path( __FILE__ ). get_post_meta( 
			$post->ID, '_wp_page_template', true
		);

		// Just to be safe, we check if the file exist first
		if ( file_exists( $file ) ) {
			return $file;
		} else {
			echo $file;
		}

		return $template; // Return template

	}

} 
add_action( 'plugins_loaded', array( 'PageTemplater', 'get_instance' ) );

При этом файл шаблона (template-setquantity.php) должен лежать в корне плагина. Request template for Set Quantity — название шаблона.

Поделиться в соц. сетях:

  • Похожие записи
  • Комментарии
  • Вложения
Плагин Posts 2 Posts

Плагин Posts 2 Posts

Плагин Posts 2 Posts создает функционал связей многие ко многим (many-to-many). Плагин может использоваться для самых разнообразных задач. Posts 2 Posts После установки плагина, в админке не будет никаких управляющих Читать далее »

/
Мультиязычность сайта

Мультиязычность сайта

Мультиязычность сайта можно обеспечить несколькими способами: ручной перевод, автоматический перевод, либо с помощью системы мультисайт. В данной статье рассмотрим первые 2 способа. Ручной перевод сайта — Polylang Для того чтобы Читать далее »

/
Изображение для категории товаров

Изображение для категории товаров

В дизайнерских целях иногда требуется выводить изображение для категории товаров. Сделать это можно несколькими способами: плагином, кодом в functions, либо дополнительными полями.При этом кодом в funtions описанном мы будем использовать Читать далее »

/

Добавить комментарий

Пока нет комментариев. Будь первым!

Шаблон страницы из плагина
Проблемы мультисайтовости
Рекомендации для васПроблемы мультисайтовостиOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.