Title: New fields using hooks
Last modified: August 22, 2016

---

# New fields using hooks

 *  Resolved [ThomasLG](https://wordpress.org/support/users/thomaslg/)
 * (@thomaslg)
 * [11 years, 3 months ago](https://wordpress.org/support/topic/new-fields-using-hooks/)
 * Hi!
    I’m trying to add new form fields using hooks/filters. So far I managed 
   to add the field itself, the problem is storing and using the field input. I 
   have been looking at the plugin functions, but don’t really get how I should 
   use $this/$booking. It would be awesome if you could take a quick look at it 
   and point me in the right direction. I’ll get straight to it, here’s the code
   so far (just using functions.php at the moment):
 *     ```
       // ADDING NEW FIELDS: WORKING!
       add_filter( 'rtb_booking_form_fields', 'buoy_custom_fields', 10, 2 );
       function buoy_custom_fields( $fields, $request ) {
         $fields['reservation']['fields']['retter']['title'] = 'Retter';
         $fields['reservation']['fields']['retter']['request_input'] = empty( $request->request_retter ) ? '' : $request->request_retter;
         $fields['reservation']['fields']['retter']['callback'] = 'rtb_print_form_text_field';
   
         return $fields;
       }
   
       // SAVING VALIDATED DATA: NOT WORKING!
       add_filter( 'rtb_validate_booking_submission', 'buoy_custom_load', 10, 3 );
       function buoy_custom_load( $this, $booking ) {
         $this->retter = empty( $_POST['rtb-retter'] ) ? '' : sanitize_text_field( stripslashes_deep( $_POST['rtb-retter'] ) );
   
       // I believe I should be adding something to $booking here?
   
         return $this;
       }
   
       // SAVING INPUT TO POST METADATA: NOT WORKING
       add_filter( 'rtb_insert_booking_metadata', 'buoy_insert_meta', 10, 2 );
       function buoy_insert_meta( $meta, $this) {
         $meta['retter'] = $_POST['rtb-retter'] ;
       // Tried using "$this->booking->retter" etc. - produces error msg
   
         return $meta;
       }
   
       // DISPLAY INPUT IN MAIL BY TEMPLATE TAG: TAG IS DISPLAYED, NO INPUT DATA
       add_filter( 'process_template', 'buoy_template_tags', 10, 2 );
       function buoy_template_tags( $template_tags, $notification) {
         $template_tags['{retter}'] = "test";
   
         return $template_tags;
       }
       ```
   
 * [https://wordpress.org/plugins/restaurant-reservations/](https://wordpress.org/plugins/restaurant-reservations/)

Viewing 15 replies - 1 through 15 (of 17 total)

1 [2](https://wordpress.org/support/topic/new-fields-using-hooks/page/2/?output_format=md)
[→](https://wordpress.org/support/topic/new-fields-using-hooks/page/2/?output_format=md)

 *  Thread Starter [ThomasLG](https://wordpress.org/support/users/thomaslg/)
 * (@thomaslg)
 * [11 years, 3 months ago](https://wordpress.org/support/topic/new-fields-using-hooks/#post-5649327)
 * If I using “rtb_insert_booking_metadata” try storing for instance $meta[‘retter’]
   = $this->retter; I get a fatal error from the web server for using $this…. Apparently
   that’s not the way to do it, although that’s how you do it in the insert_post_data
   function itself in Booking.class.php….
 *  [NateWr](https://wordpress.org/support/users/natewr/)
 * (@natewr)
 * [11 years, 3 months ago](https://wordpress.org/support/topic/new-fields-using-hooks/#post-5649332)
 * Hi ThomasLG,
 * Nice work! Looks like you’re almost there. Nice to see my filters getting used.
   I hope to write a step-by-step tutorial for doing this in the future. In the 
   meantime, the following should get you on track. Please note I haven’t run this
   code so you might need to fix typos, etc.
 *     ```
       // Validate data
       //
       // In Booking.class.php, it passes $this, which is an instance of itself,
       // a rtbBooking object. $this is a special variable that a class uses
       // to refer to itself. So when we receive it in the action callback, we
       // call it $booking.
       //
       // This filter is only for validating the data and storing it in the
       // booking object. You don't actually save anything here.
       add_filter( 'rtb_validate_booking_submission', 'buoy_custom_load' );
       function buoy_custom_load( $booking ) {
         $booking->retter = empty( $_POST['rtb-retter'] ) ? '' : sanitize_text_field( stripslashes_deep( $_POST['rtb-retter'] ) );
   
         // You only need to add something to $booking if you want to send
         // a validation error. For instance, if you wanted this field to be
         // required, you'd have to set an error like this:
         // https://github.com/NateWr/restaurant-reservations/blob/master/includes/Booking.class.php#L384-L390
   
         return $booking;
       }
   
       // Save metadata fields
       //
       // Here is where we add the information from the booking to the array
       // of metadata that is actually stored in the database. So now we have
       // the info stored in the database.
       add_filter( 'rtb_insert_booking_metadata', 'buoy_insert_meta', 10, 2 );
       function buoy_insert_meta( $meta, $booking) {
   
         // Always pull the data from teh $booking object here instead of post,
         // because that way we can be certain the data has been sanitized
         // during the validation process
         $meta['retter'] = $booking->retter;
   
         return $meta;
       }
   
       // Load the new metadata when a booking is loaded
       //
       // This is the missing piece of the puzzle. When the booking is retrieved
       // from teh database, you need to make sure to pull out your new meta
       // data.
       //
       // (Actually, I'm missing a filter here, which I'll add soon to make
       // this easier. But this will work.)
       add_action( 'rtb_booking_load_post_data', 'buoy_load_post_data', 10, 2 );
       function buoy_load_post_data( $booking, $post ) {
   
       	// Load the post meta
       	$meta = get_post_meta( $booking->ID, 'rtb', true );
   
       	// Assign your new metadata to the booking object
       	$booking->retter = empty( $meta['retter'] ) ? '' : $meta['retter'];
       }
   
       // Process a new template tag
       //
       // You were almost there. The booking is passed into the notification so
       // you can access your metadata there.
       add_filter( 'rtb_notification_template_tags', 'buoy_template_tags', 10, 2 );
       function buoy_template_tags( $template_tags, $notification) {
         $template_tags['{retter}'] = $notification->booking->retter;
   
         return $template_tags;
       }
       ```
   
 * I wrote a brief tutorial on [adding template tags](http://themeofthecrop.com/2014/11/25/add-custom-notification-tag-reservation-notifications/)
   which you might also find helpful for adding a bit of the final polish details.
 *  [NateWr](https://wordpress.org/support/users/natewr/)
 * (@natewr)
 * [11 years, 3 months ago](https://wordpress.org/support/topic/new-fields-using-hooks/#post-5649335)
 * (I just fixed a bad reference to `$this` in `buoy_load_post_data` so if you already
   copied the code take another look.)
 *  Thread Starter [ThomasLG](https://wordpress.org/support/users/thomaslg/)
 * (@thomaslg)
 * [11 years, 3 months ago](https://wordpress.org/support/topic/new-fields-using-hooks/#post-5649346)
 * Thanks a lot, this all makes sense. And I noticed the $this that was supposed
   to be $post 😉
    I can’t make it work though, I get an email notification saying
   Retter: {retter} as if it isn’t set. I’ll continue playing with it…
 * Btw, is there any way to add the new form field to the backend bookings list?
 *  [NateWr](https://wordpress.org/support/users/natewr/)
 * (@natewr)
 * [11 years, 3 months ago](https://wordpress.org/support/topic/new-fields-using-hooks/#post-5649350)
 * The filter is wrong for the template tags. That’s why it’s not working. Change
   this line:
 * `add_filter( 'process_template', 'buoy_template_tags', 10, 2 );`
 * To this:
 * `add_filter( 'rtb_notification_template_tags', 'buoy_template_tags', 10, 2 );`
 * The `$this` that I changed should be `$booking`, but it can be `$post` too. 😉
 *  [NateWr](https://wordpress.org/support/users/natewr/)
 * (@natewr)
 * [11 years, 3 months ago](https://wordpress.org/support/topic/new-fields-using-hooks/#post-5649352)
 * You can add columns to the bookings table. It extends the WP_List_Table class,
   so it follows the same patterns. You’ll want to [add the column](https://github.com/NateWr/restaurant-reservations/blob/master/includes/WP_List_Table.BookingsTable.class.php#L287)
   to the table and then [print the value](https://github.com/NateWr/restaurant-reservations/blob/master/includes/WP_List_Table.BookingsTable.class.php#L355).
 *  [NateWr](https://wordpress.org/support/users/natewr/)
 * (@natewr)
 * [11 years, 3 months ago](https://wordpress.org/support/topic/new-fields-using-hooks/#post-5649354)
 * Actually, I believe if you name the column in the table `retter` it will print
   the value for you. Not sure though.
 *  Thread Starter [ThomasLG](https://wordpress.org/support/users/thomaslg/)
 * (@thomaslg)
 * [11 years, 3 months ago](https://wordpress.org/support/topic/new-fields-using-hooks/#post-5649357)
 * Ok, I’ll take a look at it tomorrow then, along with the possibility to change
   input field types etc. Thanks a lot anyways, this one works like a charm now.
   (
   Oh yes, I’ll use $booking instead of $post, sanitize, sanitize!)
 *  Thread Starter [ThomasLG](https://wordpress.org/support/users/thomaslg/)
 * (@thomaslg)
 * [11 years, 3 months ago](https://wordpress.org/support/topic/new-fields-using-hooks/#post-5649484)
 * Yes that seems to work fine, so the code for adding a new column is:
 *     ```
       //Add column in backend
       add_filter( 'rtb_bookings_table_columns', 'buoy_custom_col' );
       function buoy_custom_col( $columns ) {
         $columns['retter'] = 'Retter';
         return $columns;
       }
       ```
   
 * (For anyone else interested)
 *  [NateWr](https://wordpress.org/support/users/natewr/)
 * (@natewr)
 * [11 years, 3 months ago](https://wordpress.org/support/topic/new-fields-using-hooks/#post-5649497)
 * Thanks for sharing Thomas!
 *  Thread Starter [ThomasLG](https://wordpress.org/support/users/thomaslg/)
 * (@thomaslg)
 * [11 years, 2 months ago](https://wordpress.org/support/topic/new-fields-using-hooks/#post-5649608)
 * Is there any way to add a dropdown (select) form field instead of the standard
   text input/textarea? I noticed in the github template-functions.php, it contains
   a function for this, while in the wordpress plugin it’s deleted from template-
   functions.php, so using “rtb_print_form_select_field” just throws me an error.
 *  [NateWr](https://wordpress.org/support/users/natewr/)
 * (@natewr)
 * [11 years, 2 months ago](https://wordpress.org/support/topic/new-fields-using-hooks/#post-5649610)
 * Hi Thomas,
 * Yes, the Party field is being converted to a select field in the next version.
   Thats why the `rtb_print_form_select_field` exists in GitHub but not in the current
   release — it wasn’t implemented yet.
 * You can just copy that field from the git repo, rename it, then add it to your
   own plugin/theme. As long as its in the global namespace you can reference any
   callback to print your field.
 *  Thread Starter [ThomasLG](https://wordpress.org/support/users/thomaslg/)
 * (@thomaslg)
 * [11 years, 2 months ago](https://wordpress.org/support/topic/new-fields-using-hooks/#post-5649612)
 * That seems to work fine. So basically I can make any type of fields I want, as
   long as I make a new function with a unique name, and it outputs some value which
   can be processed by the plugin (inserted in bookings, metadata etc)?
 *  [NateWr](https://wordpress.org/support/users/natewr/)
 * (@natewr)
 * [11 years, 2 months ago](https://wordpress.org/support/topic/new-fields-using-hooks/#post-5649613)
 * Exactly! It’s pretty loose and you can rewrite the entire form if you want (I’m
   working on a point-and-click custom fields addon now).
 * Be sure to check out how the default fields use `<?php echo rtb_print_form_error(
   $slug ); ?>` to feed validation errors back to the form. And keep in mind that
   even if you remove a field, the validation routine will still try to validate
   for that data, so you may need to strip out unnecessary validation errors.
 *  Thread Starter [ThomasLG](https://wordpress.org/support/users/thomaslg/)
 * (@thomaslg)
 * [11 years, 2 months ago](https://wordpress.org/support/topic/new-fields-using-hooks/#post-5649614)
 * Sounds sweet. I’ve looked through a whole bunch of booking/reservation plugins,
   this seems to be the only one with a calendar, customizable form, and a bookings
   backend. I don’t mind coding a bit to make the customizations for now, but if
   you make an UI for it, this plugin will be even better 🙂
 * An issue: I’m using the shortcode to print the form in a floating DIV, but when
   I click submit to validate it, it jumps to the defined bookings page and prints
   a form with the error msgs along with it. It might have to be this way cus of
   the way the plugin is made(?), but if you did the validation feedback through
   AJAX or javascript (before the necessary php validation of course) the user wouldn’t
   have to load the bookings page when using the shortcode. Unless you see some 
   quickfix for this, I guess it’s a future feature request…

Viewing 15 replies - 1 through 15 (of 17 total)

1 [2](https://wordpress.org/support/topic/new-fields-using-hooks/page/2/?output_format=md)
[→](https://wordpress.org/support/topic/new-fields-using-hooks/page/2/?output_format=md)

The topic ‘New fields using hooks’ is closed to new replies.

 * ![](https://ps.w.org/restaurant-reservations/assets/icon-128x128.png?rev=2205491)
 * [Five Star Restaurant Reservations - WordPress Booking Plugin](https://wordpress.org/plugins/restaurant-reservations/)
 * [Frequently Asked Questions](https://wordpress.org/plugins/restaurant-reservations/#faq)
 * [Support Threads](https://wordpress.org/support/plugin/restaurant-reservations/)
 * [Active Topics](https://wordpress.org/support/plugin/restaurant-reservations/active/)
 * [Unresolved Topics](https://wordpress.org/support/plugin/restaurant-reservations/unresolved/)
 * [Reviews](https://wordpress.org/support/plugin/restaurant-reservations/reviews/)

## Tags

 * [filter](https://wordpress.org/support/topic-tag/filter/)
 * [new fields](https://wordpress.org/support/topic-tag/new-fields/)

 * 17 replies
 * 2 participants
 * Last reply from: [NateWr](https://wordpress.org/support/users/natewr/)
 * Last activity: [11 years, 2 months ago](https://wordpress.org/support/topic/new-fields-using-hooks/page/2/#post-5649616)
 * Status: resolved