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….
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 which you might also find helpful for adding a bit of the final polish details.
(I just fixed a bad reference to $this
in buoy_load_post_data
so if you already copied the code take another look.)
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?
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. 😉
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 to the table and then print the value.
Actually, I believe if you name the column in the table retter
it will print the value for you. Not sure though.
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!)
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)
Thanks for sharing Thomas!
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.
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.
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)?
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.
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…