به عنوان مثال فرض کنید میخواهیم به صفحه افزودن دسته های پیش فرض وردپرس و یا تکسانومی های سفارشی خود فیلدی ساده اضافه کنیم تا آدرس یک تصویر را در آن قرار دهیم مانند تصویر زیر. برای این کار ابتدا باید ui آن را ایجاد کنیم برای این کار میبایست توسط اکشن Taxonomy Name_add_form_fields هوک بزنیم.
توجه : نام این اکشن باید حتما ترکیبی از نام تکسانومی و مقدار رزرو شده _add_form_fields باشد، درصورتی که میخواهید فیلد خود را به دسته های پیش فرض وردپرس اضافه کنید به جای نام تکسانومی از category استفاده کنید.
در این اکش ۳ نکته مهم وجود دارد که باید به آن توجه داشت، که به شرح ذیل است:
کدهای اکشن و تابع آن
//Hook------->Taxonomy Name_add_form_fields
add_action('tin_product_type_add_form_fields', 'tin_add_meta_box_product_type', 10, 1);
function tin_add_meta_box_product_type($taxonomy)
{
?>
<div class="form-field term-group">
<label class="featuret-group">تصویر</label>
<input type="url" class="postform" id="tin_meta_box_image" name="tin_term_image">
</div>
<?php
}
در گام اول ui را ایجاد کردیم و به input اصلی خود اتربیوت name دایم و مقدار آن را tin_term_image گذاشتم. حال در این مرحله توسط همین اتربیوت مقدار input را گرفته و ذخیره میکنیم. برای ذخیره کردن فیلد خود ابتدا باید توسط اکشن created_Taxonomy Name هوک بزنیم.
توجه : نام این اکشن باید حتما ترکیبی از مقدار رزرو شده created_ و نام تکسانومی باشد، درصورتی که این کار را برای دسته های پیش فرض وردپرس انجام میدهید به جای نام تکسانومی از category استفاده کنید.
کدهای اکشن و تابع آن
//Hook------->created_Taxonomy Name
add_action('created_tin_product_type', 'tin_save_meta_box_product_type', 10, 1);
function tin_save_meta_box_product_type($term_id)
{
if( isset( $_POST['tin_term_image'])){
$tin_term_image=sanitize_text_field($_POST['tin_term_image']);
update_term_meta($term_id, 'tin_term_image', $tin_term_image);
}
}
بخش دسته ها و یا تکسانومی ها شامل ۲ صفحه است، صفحه ای که آن را ایجاد میکنید و صفحه ای که میتوانید دسته افزوده شده را ویرایش کنید. ما در گام اول UI فیلد مورد نظر خود را به صفحه ایجاد دسته یا تکسانومی اضافه کردیم حال نوبت آن است که به صفحه ویرایش دسته هم UI مد نظر خود را اضافه کنیم.
توجه : نام این اکشن باید حتما ترکیبی از نام تکسانومی و مقدار رزرو شده _edit_form_fields باشد، درصورتی که میخواهید فیلد خود را به دسته های پیش فرض وردپرس اضافه کنید به جای نام تکسانومی از category استفاده کنید.
نکته مهم این بخش این است که ما باید مقداری که از input خود در صفحه ایجاد دسته گرفتیم و ذخیره کردیم را بگیریم و در input نمایش دهیم تا کاربر در صورت نیاز آن را تغییر دهد. برای این کار از تابع get_term_meta استفاده میکنیم این تابع سه ورودی میکیرد که به شرح ذیل است
و در آخر توسط اتربیوت value از تگ input مقدار را در input چاپ میکنیم.
کدهای اکشن و تابع آن
////Hook------->Taxonomy Name_edit_form_fields
add_action('tin_product_type_edit_form_fields', 'tin_edit_meta_box_product_type', 10, 2);
function tin_edit_meta_box_product_type($term, $taxonomy)
{
$term_image=get_term_meta( $term->term_id, 'tin_term_image', true );
?>
<tr class="form-field term-group-wrap">
<th scope="row">
<label class="featuret-group">تصویر</label>
</th>
<td>
<input type="url" value="<?php echo $term_image; ?>" class="postform" id="tin_meta_box_image" name="tin_term_image">
</td>
</tr>
<?php
}
این گام شبیه به گام دوم است با این تفاوت که نام اکشن آن به جای created_ و نام تکسانومی مقدار edited_ و نام تکسانومی میباشد و حتی میتوان در اکشن خود نام تابع گام دوم را فراخوانی کرد و دیگر برای اکشن خود تابع جدیدی ایجاد نکرد.
توجه : نام این اکشن باید حتما ترکیبی از مقدار رزرو شده edited_ و نام تکسانومی باشد، درصورتی که این کار را برای دسته های پیش فرض وردپرس انجام میدهید به جای نام تکسانومی از category استفاده کنید.
کدهای اکشن و تابع آن
//Hook------->edited_Taxonomy Name
add_action('edited_tin_product_type', 'tin_edited_meta_box_product_type', 10, 1);
function tin_edited_meta_box_product_type($term_id)
{
if (isset($_POST['tin_term_image'])) {
$tin_term_image = sanitize_text_field($_POST['tin_term_image']);
update_term_meta($term_id, 'tin_term_image', $tin_term_image);
}
}
از باکس کد زیر میتوانید کدهایی که در این ۴ گام زدیم را به صورت یکجا مشاهده کنید و در صورت نیاز کپی کرده و به پروژه خود اضافه کنید.
/////////////////////////////////////////////////
//گام اول : افزودن فیلدهای صفحه ایجاد دسته
//Hook------->Taxonomy Name_add_form_fields
/////////////////////////////////////////////////
add_action('tin_product_type_add_form_fields', 'tin_add_meta_box_product_type', 10, 1);
function tin_add_meta_box_product_type($taxonomy)
{
?>
<div class="form-field term-group">
<label class="featuret-group">تصویر</label>
<input type="url" class="postform" id="tin_meta_box_image" name="tin_term_image">
</div>
<?php
}
/////////////////////////////////////////////////
//گام دوم : ذخیره فیلدهای صفحه ایجاد دسته در دیتابیس
//Hook------->created_Taxonomy Name
/////////////////////////////////////////////////
add_action('created_tin_product_type', 'tin_save_meta_box_product_type', 10, 1);
function tin_save_meta_box_product_type($term_id)
{
if (isset($_POST['tin_term_image'])) {
$tin_term_image = sanitize_text_field($_POST['tin_term_image']);
update_term_meta($term_id, 'tin_term_image', $tin_term_image);
}
}
/////////////////////////////////////////////////
//گام سوم : افزودن فیلدهای صفحه ویرایش
////Hook------->Taxonomy Name_edit_form_fields
/////////////////////////////////////////////////
add_action('tin_product_type_edit_form_fields', 'tin_edit_meta_box_product_type', 10, 2);
function tin_edit_meta_box_product_type($term, $taxonomy)
{
$term_image=get_term_meta( $term->term_id, 'tin_term_image', true );
?>
<tr class="form-field term-group-wrap">
<th scope="row">
<label class="featuret-group">تصویر</label>
</th>
<td>
<input type="url" value="<?php echo $term_image; ?>" class="postform" id="tin_meta_box_image" name="tin_term_image">
</td>
</tr>
<?php
}
/////////////////////////////////////////////////
//گام چهارم: ذخیره فیلدهای صفحه ویرایش در دیتابیس
//Hook------->edited_Taxonomy Name
/////////////////////////////////////////////////
add_action('edited_tin_product_type', 'tin_edited_meta_box_product_type', 10, 1);
function tin_edited_meta_box_product_type($term_id)
{
if (isset($_POST['tin_term_image'])) {
$tin_term_image = sanitize_text_field($_POST['tin_term_image']);
update_term_meta($term_id, 'tin_term_image', $tin_term_image);
}
}
توسط روش هایی که در آموزش های قبلی بیان شد مثل کوئری، توابع، فانکشن ها و … میتوان دسته ها را در قالب فراخوانی کرد و نمایش داد. ولی برای نمایش فیلدهای سفارشی باید از تابع get_term_meta در حلقه ها و کد های خود استفاده کنید. این تابع ۳ ورودی میگیرد که به شرح ذیل است.
get_term_meta($term_id:integer,$key:string,$single:boolean );
در مثال زیر میخواهیم توسط تابع Get_Terms فیلد های سفارشی که اضافه کردیم را توسط دستور get_term_meta نمایش دهیم.
$args = array(
'taxonomy' => 'tin_product_type',
'hide_empty' => false,
);
$terms = get_terms($args);
foreach ($terms as $term) {
$id = $term->term_id;
$img = get_term_meta($id, 'tin_term_image', true);
if ($img) {
echo $img . '</br>';
} else {
echo 'No Image </br>';
}
}
نمونه کد زیر نمونه پیشرفته تر کدهای بالا است که علاوه بر فیلد سفارشی میتواند نام، لینک، توضیحات و … هم نمایش دهد.
<?php
$args = array(
'taxonomy' => 'tin_product_type',
'hide_empty' => false,
);
$terms = get_terms($args);
foreach ($terms as $term) {
$id = $term->term_id;
$name = $term->name;
$description = $term->description;
$link = esc_url(get_term_link($term));
$img = get_term_meta($id, 'tin_term_image', true);
?>
<a href="<?php echo $link; ?>">
<?php if (!empty($img)) : ?>
<img src="<?php echo $img; ?>">
<?php else : ?>
<p>No Image</p>
<?php endif; ?>
<h1><?php echo $name; ?></h1>
<p><?php echo $description; ?></p>
</a>
<?php
}
مثال ساده که فقط فیلد سفارشی را نمایش میدهد.
$queried_object=get_queried_object();
$id = $queried_object->term_id;
$img = get_term_meta($id, 'tin_term_image', true);
if(!empty($img)){
echo $img;
}else{
echo 'NO Image';
}
نمونه کد زیر نمونه پیشرفته تر کدهای بالا است که علاوه بر فیلد سفارشی میتواند نام، لینک، توضیحات و … هم نمایش دهد.
<?php
$queried_object = get_queried_object();
$id = $queried_object->term_id;
$img = get_term_meta($id, 'tin_term_image', true);
$name = $queried_object->name;
$description = $queried_object->description;
$link = esc_url(get_term_link($queried_object));
?>
<a href="<?php echo $link; ?>">
<?php if (!empty($img)) : ?>
<img src="<?php echo $img; ?>">
<?php else : ?>
<p>No Image</p>
<?php endif; ?>
<h1><?php echo $name; ?></h1>
<p><?php echo $description; ?></p>
</a>
<?php