Shortcode does not work
- This topic has 12 replies, 2 voices, and was last updated 3 years, 11 months ago by
Ulysse.
-
AuthorPosts
-
May 28, 2021 at 12:27 AM #28477
Ulysse
ParticipantI created a simple shortcode to display custom fields of a custom post but it does not work.
I created the custom post "events".
I created a template with elementor and on this template I want to diplay the shortcode
[datesofevent] to get "from 12/03/2021 to 13/02/2021".But it does not work and I don't know why. In fact I don't get any error message, it's just the shortcode which is not seen as a shortcode.
add_shortcode( 'datesofevent', function() { $post_id = get_the_ID(); // Get the dates $startdate = get_post_field( 'ci_event_start_date', $post_id ); $enddate = get_post_field( 'ci_event_end_date', $post_id ); // return return "from $startdate to $enddate" ; } );
Could you help me please?
May 28, 2021 at 4:57 PM #28493Long Nguyen
ModeratorHi,
Where do you add the code? In the file functions.php in the theme folder?
If you use the Oxygen Builder, it prevents the theme's file loaded. You can use the plugin Code Snippets to run the custom functions.
https://wordpress.org/plugins/code-snippets/May 28, 2021 at 5:31 PM #28494Ulysse
ParticipantThank you.
I was using "script organizer" and it didn't work. With code snippet, it works.I have another issue with the dates format.
I want to change the format and I failed.
I added a line to check the date: echo date('l jS \of F Y',$startdate)So now, it's like that:
add_shortcode( 'datesofevent', function() { $post_id = get_the_ID(); // Get the dates $startdate = get_post_field( 'ci_event_start_date', $post_id ); $enddate = get_post_field( 'ci_event_end_date', $post_id ); echo date('l jS \of F Y',$startdate); // return return "from $startdate to $enddate"; } );
But the result is the following:
Thursday 1st of January 1970
from 2021-05-24 to 2021-05-18It's like $startdate was empty but it's not as it's well displayed in the following line.
My metabox is like that:
<?php add_filter( 'rwmb_meta_boxes', 'your_prefix_function_name' ); function your_prefix_function_name( $meta_boxes ) { $prefix = ''; $meta_boxes[] = [ 'title' => __( 'Fields for Events', 'your-text-domain' ), 'id' => 'fields_for_events', 'post_types' => ['event'], 'fields' => [ [ 'name' => __( 'Organizer', 'your-text-domain' ), 'id' => $prefix . 'ci_event_organizer', 'type' => 'text', ], [ 'name' => __( 'Start date', 'your-text-domain' ), 'id' => $prefix . 'ci_event_start_date', 'type' => 'date', 'timestamp' => true, ], [ 'name' => __( 'End date', 'your-text-domain' ), 'id' => $prefix . 'ci_event_end_date', 'type' => 'date', 'timestamp' => true, ], [ 'name' => __( 'Start Time', 'your-text-domain' ), 'id' => $prefix . 'ci_event_start_time', 'type' => 'time', ], [ 'name' => __( 'End time', 'your-text-domain' ), 'id' => $prefix . 'ci_event_end_time', 'type' => 'time', ], [ 'name' => __( 'Location name', 'your-text-domain' ), 'id' => $prefix . 'ci_event_location_name', 'type' => 'text', ], [ 'name' => __( 'Location website', 'your-text-domain' ), 'id' => $prefix . 'ci_event_location_website', 'type' => 'url', ], [ 'name' => __( 'Location address', 'your-text-domain' ), 'id' => $prefix . 'ci_event_location_address', 'type' => 'text', ], [ 'name' => __( 'Location map', 'your-text-domain' ), 'id' => $prefix . 'ci_event_location_map_osm', 'type' => 'map', 'api_key' => 'AIzaSyB10BYJnnZJ1WuLERm9IsGVD2xb0mPiFsk', 'address_field' => 'ci_event_location_address', ], [ 'name' => __( 'Website to buy ticket', 'your-text-domain' ), 'id' => $prefix . 'ci_event_website_to_buy_ticket', 'type' => 'url', ], [ 'name' => __( 'Performer name', 'your-text-domain' ), 'id' => $prefix . 'ci_event_performer_name', 'type' => 'text', ], [ 'name' => __( 'Event status', 'your-text-domain' ), 'id' => $prefix . 'ci_event_status', 'type' => 'checkbox_list', 'options' => [ 'EventCancelled' => __( 'EventCancelled', 'your-text-domain' ), 'EventMovedOnline' => __( 'EventMovedOnline', 'your-text-domain' ), 'EventPostponed' => __( 'EventPostponed', 'your-text-domain' ), 'EventRescheduled' => __( 'EventRescheduled', 'your-text-domain' ), 'EventScheduled' => __( 'EventScheduled', 'your-text-domain' ), ], 'inline' => true, ], [ 'name' => __( 'Event attendance mode', 'your-text-domain' ), 'id' => $prefix . 'ci_event_attendance_mode', 'type' => 'checkbox_list', 'options' => [ 'OfflineEventAttendanceMode' => __( 'OfflineEventAttendanceMode', 'your-text-domain' ), 'OnlineAttendanceMode' => __( 'OnlineAttendanceMode', 'your-text-domain' ), 'MixedEventAttendanceMode' => __( 'MixedEventAttendanceMode', 'your-text-domain' ), ], 'inline' => true, ], [ 'name' => __( 'Gallery', 'your-text-domain' ), 'id' => $prefix . 'ci_event_gallery', 'type' => 'image', 'label_description' => __( 'Upload up to 5 images', 'your-text-domain' ), 'max_file_uploads' => 5, 'force_delete' => true, 'upload_dir' => '/home/creativinn/public_html/\\events', ], ], ]; return $meta_boxes; }
May 29, 2021 at 8:21 AM #28504Long Nguyen
ModeratorHi,
The function get_post_field() get the post fields such as
post_type
,post_status
,post_content
. You can see on the documentation https://developer.wordpress.org/reference/functions/get_post_field/To get the post meta (custom field), you can use the function get_post_meta() or helper function rwmb_meta()
May 29, 2021 at 4:35 PM #28506Ulysse
ParticipantHi,
It does not work either.Here is my new code:
<?php add_shortcode( 'datesofevent', function() { $post_id = get_the_ID(); // Get the dates $startdate = get_post_field( 'ci_event_start_date', $post_id ); $enddate = get_post_field( 'ci_event_end_date', $post_id ); $startdate1 = rwmb_meta( 'ci_event_start_date', $post_id ) ; echo date('l jS \of F Y ', $startdate1); // return return "startdate = $startdate or startdate1 = $startdate1" ; } ); ?>
And the result:
Thursday 1st of January 1970
startdate = 2021-05-24 or startdate1 = 2021-05-24So when I want to format the date, the value is not right.
May 30, 2021 at 3:12 PM #28523Long Nguyen
ModeratorHi,
There are two points in your code:
- The helper function rwmb_meta() need to add 3 arguments if you pass field ID and post ID.
$startdate1 = rwmb_meta( 'ci_event_start_date', '', $post_id ) ;
- The function date() only accept to the second argument
$startdate1
in the timestamp format. Please double-check this point.
May 30, 2021 at 8:08 PM #28529Ulysse
ParticipantThank you very much.
Now it works like that:<?php add_shortcode( 'datesofevent', function() { $post_id = get_the_ID(); // Get the dates $startdate = get_post_field( 'ci_event_start_date', $post_id ); $enddate = get_post_field( 'ci_event_end_date', $post_id ); echo "from ", date('l jS \of F Y ', $startdate), " to ", date('l jS \of F Y ', $enddate); // return return ; } ); ?>
I wanted to write :
return "from ". date('l jS \of F Y ', $startdate). " to ". date('l jS \of F Y ', $enddate);
but it didn't work. Si I let return alone and included a "echo xxxxx"
Sorry but I have a new question related to the shortcodes. Do I need to sanitize the data in the shortcode. I thought they were already sanitized in the metaboxes.
If yes, I understand that I have to do it for every shortcode or function I have created? Thank you for your clarification.May 30, 2021 at 11:11 PM #28532Ulysse
ParticipantHi again
I eventually made this code:<?php add_shortcode( 'datesofevent', function() { $post_id = get_the_ID(); // Get the dates $startdate = get_post_field( 'ci_event_start_date', $post_id ); $enddate = get_post_field( 'ci_event_end_date', $post_id ); $datesofevent = "from ". date('l jS \of F Y ', $startdate) . " to ". date('l jS \of F Y ', $enddate); sanitize_text_field( $datesofevent ) ; // return return $datesofevent ; } ); ?>
Please, could you tell me if it is well sanitized?
May 31, 2021 at 12:55 PM #28553Long Nguyen
ModeratorHi,
Custom fields created by Meta Box have the default sanitize callbacks, you can read more here https://docs.metabox.io/sanitization/.
And sanitization use for input data, for output data, you should use the escaping output. Follow on WordPress documentation https://developer.wordpress.org/themes/theme-security/data-sanitization-escaping/
May 31, 2021 at 1:11 PM #28555Ulysse
ParticipantHi,
Thank you for your answer.
It's what I tried to use with sanitize_text_field( $datesofevent ) in my code. Is it correct?May 31, 2021 at 1:24 PM #28556Ulysse
ParticipantDo I have to replace my return $datesofevent by return esc_textarea( $datesofevent ) ?
June 1, 2021 at 5:48 AM #28579Long Nguyen
ModeratorJune 1, 2021 at 2:14 PM #28588Ulysse
ParticipantThank you very much.
-
AuthorPosts
- You must be logged in to reply to this topic.