تعداد بازدید: 1465

بازنویسی قالب های وردپرس template hierarchy

وردپرس این امکان را برای شما فراهم می کند تا قالب های پیش فرض وردپرس رو بازنویسی کنید و یا همچنین یک سری قالب های جدید بر حسب قوانین جدید فراخوانی کنید و یا قالب های موجود رو بسط بدید. بدین شکل که شما قالب فایل جدید رو به نقطه دلخواه خودتون به قالب های موجود در تابع get_query_template واردکنید.

نکته : یکی از مهم ترین کاربرد های این مورد بازنویسی قالب جدید در پلاگین است. یعنی قالب single.php رو از داخل پلاگین شما فراخوانی کنه.

در مقاله معماری قالب وردپرس شما با قالب های پیش فرض وردپرس آشنا شدید. در این مقاله توضیح داده شده که چگونه با استفاده از فیلتر های زیر قالب های موجود رو بازنویسی کنید:

  • {type}_template
  • template_include
  • woocommerce_locate_template

بسط دادن قالب های موجود – {type}_template

فیلتر مورد نظر شما باید به شکل {type}_template ساخته بشه . نمونه های زیر را دریابید:

  • 404_template : زمانی که وارد قالب صفحه ۴۰۴ شد.
  • embed_template
  • search_template : زمانی که وارد قالب جستجو شد.
  • frontpage_template
  • home_template
  • taxonomy_template : اگر قالب taxonomy فراخوانی شد.
  • attachment_template
  • single_template : زمانی که قصد رفتن به صفحه داخلی پست را داشت. یعنی فراخوانی single
  • page_template
  • singular_template
  • category_template
  • tag_template
  • author_template
  • date_template
  • archive_template
  • index_template

به طور مثال شما می خواهید یک فایل جدید به قالب نویسنده که آن را پیشتر بررسی کردیم اضافه کنید. قالب به شکل زیر بود:

  1. author-{role}.php
  2. author-{nic-name}.php
  3. author-{id}.php
  4. author.php
  5. archive.php
  6. index.php

مثال اول : اگر بخواهید بر حسب یک query string خاص قالب های خاص از نویسنده نمایش داده بشه. مثلا query string با نام role داشته باشیم. و برای نویسنده ای مقدار query string برابر با editor باشه . زمان فراخوانی قالب نویسنده به دنبال فایل author-editor.php بگرده.

خوب شما می خواهید که برای query string با نام role قالبی ایجاد کنید با نام author-{role}.php که باید query variable آن را از قبل ایجاد کرده باشید.

برای اضافه کردن author-{role}.php قبل از author.php باید فیلتری به قالب author_template اضافه کنید.

<?php
function author_role_template( $templates = '' ) {
    $author = get_queried_object();
    $role = $author->roles[0];
 
    if ( ! is_array( $templates ) && ! empty( $templates ) ) {
        $templates = locate_template( array( "author-$role.php", $templates ), false );
    } elseif ( empty( $templates ) ) {
        $templates = locate_template( "author-$role.php", false );
    } else {
        $new_template = locate_template( array( "author-$role.php" ) );
        if ( ! empty( $new_template ) ) {
            array_unshift( $templates, $new_template );
        }
    }
 
    return $templates;
}
add_filter( 'author_template', 'author_role_template' );

در کد بالا گفته که اگر قصد template نویسنده وارد شد و به همراه خودش query string با نام role داشت قالب فایل author-{$role}.php رو فراخوانی کن. در پایان هم گفته که اگر شروط برقرار نبود همون قالب قبلی رو برگردون که میشه همون قالب پیش فرض وردپرس.

مثال دوم : می خواهیم قالبی اضافه کنیم برای صفحه داخلی پست هایی که در دسته بندی news و article قرار دارند.

می دانیم که term در اینجا برابر news و article است و تکسونومی برابر category است.

<?php
add_filter( 'single_template', 'single_tax_term_template' );
function single_tax_term_template( $single_template ) {

    global $post;

   if ( has_term( 'article', 'category', $post->ID )  ) {
          $single_template = dirname( __FILE__ ) . '/article.php';
     }

    if ( has_term( 'news', 'category', $post->ID )  ) {
          $single_template = dirname( __FILE__ ) . '/news.php';
     }

    return $single_template;
}

تابع has_term سه پارامتر می گیره :

  • پارامتر اول term که اختیاری است. می تونید خالی بزارید ولی خالی نزارید.
  • پارامتر دوم taxonomy است که لازم است.
  • پارامتر سوم پست مربوطه است.

پس در قطعه کد بالا گفته که اگر پست جاری در دسته بندی news بود به فایل news.php برو و اگر در دسته بندی article بود به article.php برو. دقت داشته باشید که مسیر دهی در مثال بالا برحسب فایل جاری هست که از تابع dirname( __FILE__ ) استفاده شده. یعنی فایل تابع و قالب در یک مسیر هستند.

نکته : قبل از این که تمامی فیلترهایی که در قبل توضیح دادیم فراخوانی بشن فیلتر کلی template_include فراخوانی میشه که کلی تر هست و برای تمامی قالب ها نظیر single_template , archive_template , … کاربرد دارد.

مثال سوم : فراخوانی برگه خاص برای برگه ای با نامک portfolio :

<?php
add_filter( 'template_include', 'portfolio_page_template', 99 );

function portfolio_page_template( $template ) {

	if ( is_page( 'portfolio' ) ) {
		$new_template = locate_template( array( 'portfolio-page-template.php' ) );
		if ( !empty( $new_template ) ) {
			return $new_template;
		}
	}

	return $template;
}

بازنویسی قالب های ووکامرس – woocommerce_locate_template

همون طور که می دونید ووکامرس هم یه سری قالب داره که هم میتونید در پوسته خودتون قرارش بدید و یا اگر وجود نداشت به قالب های موجود در خود پلاگین مراجعه کنه. حالا فرض کنید شما دارید یه extension برای پلاگین ووکامرس می نویسید و نیاز دارید تا یه سری قالب های ووکامرس رو بازنویسی و یا از داخل پلاگین خودتون اون رو فراخوانی کنید.

<?php
add_filter( 'woocommerce_locate_template', 'woo_addon_plugin_template', 1, 3 );
function woo_addon_plugin_template( $template, $template_name ) {
	global $woocommerce;
	if ( $template_name == 'cart/cart.php' ) {
		$template = dirname( __FILE__ ) . 'cart.php'
	} elseif ( $template_name == 'checkout/review-order.php' ) {
		$template = dirname( __FILE__ ) . 'review-order.php'
	} elseif ( $template_name == 'order/order-details.php' ) {
		$template = dirname( __FILE__ ) . 'order-details.php'
	} elseif ( $template_name == 'order/order-details-item.php' ) {
		$template = dirname( __FILE__ ) . 'order-details-item.php'
	} elseif ( $template_name == 'emails/email-order-details.php' ) {
		$template = dirname( __FILE__ ) . 'emails/email-order-details.php'
	} elseif ( $template_name == 'emails/email-order-items.php' ) {
		$template = dirname( __FILE__ ) . 'emails/email-order-items.php'
	}
	return $template;
}

همون طور که در کد بالا می بینید می تونید قالب های ووکامرسی را با استفاده از slug اون ها بازفراخوانی کنید. مثلا در مثال بالا قالب های موجود در دایرکتوری جاری هست برای فراخوانی از تابع dirname( __FILE__ ) استفاده شده. یعنی فایل تابع و فایل های قالب در یک مسیر هستند.

 

مطالب مشابه

آموزش نکات و تکنیک های برنامه نویسی وردپرس

WP_Query در وردپرس

مدل محتوای (Model) وردپرس پست است ، یعنی محتواها در قالب های مختلف پست هایی با ویژگی های مختلف می باشند. کلاس WP_Query...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای بازنویسی قالب های وردپرس template hierarchy

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *