متاباکس (meta box) در وردپرس

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

برای ایجاد متاباکس در وردپرس از تابع add_meta_box استفاده می کنیم. این تابع هفت پارامتر ورودی می پذیرد که چهار پارامتر آخر اختیاری است. پارامتر اول آیدی css بلاک متاباکس، پارامتر دوم عنوان متاباکس، پارامتر سوم نام تابعی که برای نمایش محتوای متاباکس فراخوانده می شود، پارامتر چهارم صفحه ای که متاباکس در آن به نمایش در می آید، پارامتر پنجم بخشی از صفحه که متاباکس در آن قسمت نمایش داده می شود، پارامتر ششم اولویت نمایش متاباکس و پارامتر آخر آرایه ای حاوی اطلاعات متاباکس است. هوک اکشنی که برای ایجاد متاباکس استفاده می شود هوک add_meta_boxes است.

مثال: ایجاد متاباکس برای نوع داده post (مطالب وردپرس)

<?php
add_action( 'add_meta_boxes', 'mbpt_mbe_create');
             
function mbpt_mbe_create(){    
    add_meta_box( 'boj-meta', 'My Custom Meta Box', 'mbpt_mbe_function', 'post','normal', 'high');
             }
  function mbpt_mbe_function(){
             
    echo 'Welcome to my meta box';
             }
?>

با اجرای کد فوق، متاباکس جدیدی حاوی جمله Welcome to my meta box به صفحات ایجاد و ویرایش پست های وردپرس اضافه می گردد.

ذخیره سازی اطلاعات متاباکس ها

برای ذخیره سازی اطلاعات متاباکس ها که اصطلاحا به آنها متادیتا گفته می شود، از تابع update_post_meta  استفاده می شود. این تابع چهار پارامتر ورودی می پذیرد که پارامتر آخر اختیاری است. پارامتر اول آیدی پست (مطلب)، پارامتر دوم نام متادیتا، پارامتر سوم مقدار جدید متادیتا برای ذخیره سازی و پارامتر آخر مقدار قبلی متادیتا است. در صورت عدم وجود متادیتا برای پست آن را ایجاد می کند و در صورت وجود آن متادیتا، مقدار آن را بروزرسانی می نماید.

پیش از ذخیره سازی مقادیر متاباکس معمولا لازم است تا مقادیر قبلی از دیتابیس دریافت و نمایش داده شوند. این تابع برای این منظور از تابع get_post_meta استفاده می کنیم. این تابع سه پارامتر ورودی می پذیرد. پارامتر اول آیدی پست، پارامتر دوم نام متادیتا و پارامتر سوم تعیین کننده نوع داده برگشتی به صورت آرایه (با مقدار ورودی false) یا رشته (با مقدار ورودی true) است.

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

مثال:

<?php
add_action( 'add_meta_box', 'bmpt_mbe_create' );
             
function bmpt_mbe_create( $post_type) {
      $post_types = array( 'post', 'page' );        
    //create a custom meta box
if ( in_array( $post_type, $post_types ) )
    add_meta_box( 'boj-meta', 'My Custom Meta Box', 'bmpt_mbe_function',
                $post_type, 'normal', 'high' );
                         
}
             
function bmpt_mbe_function( $post ) {
             
    //retrieve the metadata values if they exist
    $bmpt_name = get_post_meta( $post- > ID, 'bmpt_name', true );
    $bmpt_costume = get_post_meta( $post- > ID, 'bmpt_costume', true );
             
    echo 'Please fill out the information below';
    ? > 
     < p > Name:  < input type="text" name="bmpt_name" value="
             < ?php echo esc_attr( $bmpt_name ); ? > " / >  < /p > 
     < p > Costume:
     < select name="bmpt_costume" > 
         < option value="vampire"  < ?php selected( $bmpt_costume, 'vampire' ); ? >  > 
            Vampire
         < / option > 
         < option value="zombie"  < ?php selected( $bmpt_costume, 'zombie' ); ? >  > 
            Zombie
         < /option >  

         < option value="smurf"  < ?php selected( $bmpt_costume, 'smurf' ); ? >  > 
            Smurf
         < /option > 
     < / select > 
     < /p > 
        < ?php
}
             
//hook to save the meta box data
add_action( 'save_post', 'bmpt_mbe_save_meta' );
             
function bmpt_mbe_save_meta( $post_id ) {
             
    //verify the metadata is set
    if ( isset( $_POST['bmpt_name'] ) ) {
             
        //save the metadata
        update_post_meta( $post_id, 'bmpt_name',
                        strip_tags( $_POST['bmpt_name'] ) );
        update_post_meta( $post_id, 'bmpt_costume',
                        strip_tags( $_POST['bmpt_costume'] ) );
             
    }
             
}
?>

در مثال فوق، ما یک فیلد متنی و یک فیلد انتخابی به متاباکس اضافه کردیم و با کمک تابع get_post_meta مقادیر قبلی متادیتاها را از پایگاه داده دریافت می کنیم. تابع selected برای تعیین فیلد انتخاب شده استفاده می شود و در صورت یکسان بودن دو پارامتر ورودی مقدار true را بر می گرداند. در مورد تابع bmpt_mbe_function که برای نمایش اطلاعات و فیلدهای متادیتا (نمایش محتوای متاباکس) استفاده شده است، ذکر این نکته ضروری است که این تابع می تواند شی پست فعلی را به عنوان پارامتر ورودی بپذیرد تا بتوان برای دریافت مقادیر قبلی متادیتا از آن استفاده نمود.

در هنگام ذخیره پست (اجرای هوک save_post)، تابع bmpt_mbe_save_meta به اجرا در می آید و در صورت ارسال مقدار نام، با کمک تابع update_post_meta مقادیر فیلدهای ارسالی ذخیره می شوند. همان طور که مشاهده می کنید آیدی پست به عنوان پارامتر ورودی اکشن bmpt_mbe_save_meta قابل دسترسی است و برای ذخیره سازی متادیتاها می توان از آن استفاده کرد.

نکته دیگر در مورد تابع اکشن ایجاد متاباکس است. در صورتی که بخواهیم به صورت شرطی و برای مجموعه ای از صفحات متاباکس یکسانی را استفاده نماییم می توانیم نوع داده (نوع پست) را به عنوان پارامتر ورودی این تابع در نظر بگیریم.

Related posts