در مطلب متاباکس چیست با این ویژگی در وردپرس آشنا شدیم. حال برای اینکه بتوانیم از Metabox بصورت کامل استفاده کنیم نیاز است تا چگونگی ذخیره اطلاعات درون متاباکس و نمایش آن در پوسته را نیز فرا بگیریم.

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

برای شروع ابتدا یک متاباکس ایجاد می کنیم:

add_action('add_meta_boxes', 'dw_addmeta');

function dw_addmeta() {
    add_meta_box('dangoweb-metabox', 'metabox title', 'metabox_callback', 'post', 'advanced', 'low');
}

محتوای اصلی متاباکس درون یک تابع با نام metabox_callback قرا گرفته و یک ورودی $post که همان نوشته بوده را دریافت می کند. بنا به نیاز می توانیم از گزینه های مختلف استفاده کنیم. مثلا استفاده از انواع input ها و… ما در اینجا می خواهیم برای هر نوشته نام، نام خانوادگی و ایمیل نویسنده را ذخیره و به نمایش بگذاریم. پس نیاز به سه input داریم:

function metabox_callback($post)
{
    ?>
    <label for="username">
        <input type="text" name="user_name" id="username">
    </label>
    <label for="userlastname">
        <input type="text" name="user_lastname" id="userlastname">
    </label>
    <label for="useremail">
        <input type="email" name="user_email" id="useremail">
    </label>
    <?php
}

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

برای ذخیره سازی داده در نوشته، از یک قلاب با نام save_post استفاده می کنیم:

add_action('save_post', 'dw_save_metabox');

حال یک تابع با نام دلخواه ایجاد می کنیم در اینجا dw_save_metabox نام دارد و یک ورودی که $post_id را دریافت می کند:

function dw_save_metabox ($post_id)
{
    if (!empty(filter_input(INPUT_POST, 'user_name')))
        update_post_meta($post_id, '_user_name', sanitize_text_field(filter_input(INPUT_POST, 'user_name')));
    else
        delete_post_meta($post_id, '_user_name', filter_input(INPUT_POST, 'user_name'));
    
    if (!empty(filter_input(INPUT_POST, 'user_lastname')))
        update_post_meta($post_id, '_user_lastname', sanitize_text_field(filter_input(INPUT_POST, 'user_lastname')));
    else
        delete_post_meta($post_id, '_user_lastname', filter_input(INPUT_POST, 'user_lastname'));
    
    if (!empty(filter_input(INPUT_POST, 'user_email')))
        update_post_meta($post_id, '_user_email', sanitize_text_field(filter_input(INPUT_POST, 'user_email')));
    else
        delete_post_meta($post_id, '_user_email', filter_input(INPUT_POST, 'user_email'));
}

در تابع بالا ما دو تابع اصلی برای ذخیره اطلاعات متاباکس خود داریم:

  • update_post_meta($post_id,$meta_key,$meta_value)
  • delete_post_meta($post_id,$meta_key,$meta_value)

update_post_meta: ایجاد و بروزرسانی داده های متا در پایگاه داده را بر عهده دارد. یعنی زمانی که داده ای با این تابع ارسال می شود، بررسی می کند که داده با کلید ارسالی در پایگاه داده وجود دارد یا خیر اگر وجود داشته باشد اطلاعات ثبت شده را بروزرسانی و در صورت نبود آن را ایجاد می کند. البته یک تابع دیگر با نام add_post_meta هم داریم که این تابع فقط اطلاعات را در پایگاه داده ثبت می کند و امکان بروزرسانی آن را ندارد. به همین دلیل ما از update_post_meta استفاده می کنیم.

delete_post_meta: با استفاده از این تابع مقادیر ثبت شده در پایگاه داده با کلید ارسالی تطبیق داده شده و حذف می شود.

حال ساختار این دو تابع را بررسی می کنیم:

  • $post_id: آیدی نوشته را دریافت می کند.
  • $meta_key: هر داده به یک کلید برای ذخیره نیاز دارد که وجه تمایز بین اطلاعات ذخیره شده است. این کلید هر نامی می تواند باشد. دلیل استفاده از _ ابتدای نام این است که بدین گونه در لیست زمینه های دلخواه نمایش داده نمی شود.
  • $meta_value: مقداری که برای ذخیره به پایگاه داده ارسال می کنیم. در اینجا نام، نام خانوادگی و ایمیل همان مقادیر ارسالی است.

در تابع dw_save_metabox از دو تابع امنیتی نیز استفاده شده تا داده دریافت شده بررسی و در صورت وجود مشکل آن را فیلتر کند:

  • filter_input: تابع php است که یک ورودی را دریافت و آن را فیلتر می‌کند.
  • sanitize_text_field: تابع وردپرس است که که ورودی را دریافت و آن را فیلتر می کند.
 if (!empty(filter_input(INPUT_POST, 'user_name')))
        update_post_meta($post_id, '_user_name', sanitize_text_field(filter_input(INPUT_POST, 'user_name')));

در خط ابتدایی ما یک دستور شرطی داریم که می گوید اگر مقدار ارسالی فیلد user_name خالی نبود دستور update_post_meta را اجرا کند. یعنی مقدار را از فیلد گرفته و ذخیر کند.

در غیر اینصورت:

 else
        delete_post_meta($post_id, '_user_name', filter_input(INPUT_POST, 'user_name'));

دستور delete_post_meta را اجرا کند. یعنی اگر مقداری ارسال نشد و یا خالی بود متا مورد نظر با کلید ارسالی را حذف کند. این کار برای ذخیره نشدن اطلاعات اضافه کارآمد است.

نمایش اطلاعات ذخیره شده متاباکس

ذخیره اطلاعات بخوبی انجام شده حالا اگر صفحه نوشته در پیشخوان را ریفرش کنید اطلاعات در فیلدها نمایش داده نمی شود. حال برای اینکه اطلاعات ذخیره شده را در فیلدها به نمایش بگذاریم دوباره به تابع metabox_callback برمی گردیم؛ و بصورت زیر عمل می کنیم:

  $username = get_post_meta($post->ID, '_user_name', true);
    $userlastname = get_post_meta($post->ID, '_user_lastname', true);
    $useemail = get_post_meta($post->ID, '_user_email', true);

در ابتدای تابع موارد بالا را اضافه می کنیم.

get_post_meta( $post_id, $key ,$single )

  • $post_id: آیدی نوشته را دریافت می کند.
  • $meta_key: هر داده به یک کلید برای ذخیره نیاز دارد که وجه تمایز بین اطلاعات ذخیره شده است.
  • $single: بصورت پیشفرض false است و یک آرایه را بر می گرداند و در صورت true بودن یک مقدار را بر می گرداند.(در آموزش های بعدی بیشتر آشنا می شوید)

تابع get_post_meta آیدی نوشته و کلید متا را گرفته و آن را به خروجی می برد. ما این خروجی را در یک متغییر ذخیره می کنیم.

حال برای نمایش مقدار ذخیره شه در فیلد بصورت زیر عمل می کنیم:

    <label for="username">
        <input type="text" name="user_name" id="username" value="<?php echo esc_attr($username); ?>">
    </label>
    <label for="userlastname">
        <input type="text" name="user_lastname" id="userlastname" value="<?php echo esc_attr($userlastname); ?>>
    </label>
    <label for="useremail">
        <input type="email" name="user_email" id="useremail" value="<?php echo esc_attr($useemail); ?>>
    </label>

esc_attr: ورودی را اعتبار سنجی کرده و مقدار را از عبارات غیرمجاز پاک می کند.

کد کامل این بخش:

function metabox_callback($post)

{
    $username = get_post_meta($post->ID, '_user_name', true);
    $userlastname = get_post_meta($post->ID, '_user_lastname', true);
    $useemail = get_post_meta($post->ID, '_user_email', true);
    ?>
    <label for="username">
        <input type="text" name="user_name" id="username" value="<?php echo esc_attr($username); ?>">
    </label>
    <label for="userlastname">
        <input type="text" name="user_lastname" id="userlastname" value="<?php echo esc_attr($userlastname); ?>>
    </label>
    <label for="useremail">
        <input type="email" name="user_email" id="useremail" value="<?php echo esc_attr($useemail); ?>>
    </label>
    <?php
}
function dw_save_metabox ($post_id)
{
    if (!empty(filter_input(INPUT_POST, 'user_name')))
        update_post_meta($post_id, '_user_name', sanitize_text_field(filter_input(INPUT_POST, 'user_name')));
    else
        delete_post_meta($post_id, '_user_name', filter_input(INPUT_POST, 'user_name'));

    if (!empty(filter_input(INPUT_POST, 'user_lastname')))
        update_post_meta($post_id, '_user_lastname', sanitize_text_field(filter_input(INPUT_POST, 'user_lastname')));
    else
        delete_post_meta($post_id, '_user_lastname', filter_input(INPUT_POST, 'user_lastname'));

    if (!empty(filter_input(INPUT_POST, 'user_email')))
        update_post_meta($post_id, '_user_email', sanitize_text_field(filter_input(INPUT_POST, 'user_email')));
    else
        delete_post_meta($post_id, '_user_email', filter_input(INPUT_POST, 'user_email'));
}
add_action('save_post', 'dw_save_metabox

نمایش اطلاعات در پوسته

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

          <?php if (post_custom('_user_name')) ?>
                    <div class="box"><?php echo get_post_meta($post->ID, '_user_name', true) ?></div>
                    <?php if (post_custom('_user_name')) ?>
                    <div class="box"><?php echo get_post_meta($post->ID, '_user_lastname', true) ?></div>
                    <?php if (post_custom('_user_name')) ?>
                    <div class="box"><?php echo get_post_meta($post->ID, '_user_email', true) ?></div>
  • post_custom: داده پست متا را برمی گرداند.
  • get_post_meta: با استفاده از آیدی نوشته و کلید متا مقدار ذخیره شده را برمی گرداند.

تا بدینجا یاد گرفتیم که چگونه مقادیر متاباکس را ذخیره و به نمایش بگذارید. بنا به نیاز خود می توانید تغییراتی در این کدها ایجاد و تمرین کنید.

دیدگاه