marcbelletre / acf-rrule
RRule field for Advanced Custom Fields
Installs: 38
Dependents: 0
Suggesters: 0
Security: 0
Stars: 15
Watchers: 2
Forks: 5
Open Issues: 4
Type:wordpress-plugin
Requires
- php: ^7.2|^8.0
- composer/installers: ^1.0|^2.0
- simshaun/recurr: ^5.0
This package is auto-updated.
Last update: 2024-10-18 12:12:53 UTC
README
Create recurring rules within a single ACF field and retrieve all the dates using the simshaun/recurr package.
Usage
<?php $rrule = get_field('rrule'); ?>
The RRule field returns an array with the following attributes:
Advanced usage
A common use case for this plugin is creating an agenda-style display for your events. Here is how I usually do it.
In the following example we will assume you have an event
custom post type with an ACF RRule field named rrule
.
The first step is to use the acf/save_post
hook to save the first and last dates in database. This is necessary for querying our events later.
/** * Save first & last occurrences of an event in database. * * @param int|string $post_id * @return void */ add_action('acf/save_post', function (int|string $post_id) { if (! $post_id || get_post_type($post_id) !== 'event') { return; } $rrule = get_field('rrule'); update_post_meta($post_id, 'start_date', $rrule['first_date']->format('Y-m-d')); update_post_meta($post_id, 'end_date', $rrule['last_date']->format('Y-m-d')); });
You will then be able to use the start_date
and end_date
meta values in a custom WP_Query
to filter events that may have occurrences between the specified dates.
$startDate = date('Y-m-d'); // Today $endDate = date('Y-m-d', strtotime('+1 month', strtotime($startDate))); // Today + 1 month // Retrieve events starting before the end date // and ending after the start date $eventsQuery = new WP_Query([ 'post_type' => 'event', 'posts_per_page' => -1, 'post_status' => 'publish', 'meta_query' => [ 'relation' => 'AND', [ 'key' => 'start_date', 'compare' => '<=', 'value' => $endDate, 'type' => 'DATE', ], [ 'key' => 'end_date', 'compare' => '>=', 'value' => $startDate, 'type' => 'DATE', ], ], ]);
The next and last step is to create an associative array of dates. Each date will be an array of events that occurs at the given date.
// Instanciate an array for our list of dates $dates = []; while ($eventsQuery->have_posts()) { $eventsQuery->the_post(); $recurrence = get_field('rrule'); // Loop through the individual dates for the recurrence foreach ($recurrence['dates_collection'] as $datetime) { $date = $datetime->format('Y-m-d'); if ($date < $startDate) { // If the date is before the start date, jump directly to the next one continue; } elseif ($date > $endDate) { // If the date is after the end date, break the loop break; } // Create the date if it doesn't exist yet if (! isset($dates[$date])) { // Each date will contain an array of events $dates[$date] = []; } // Use the event ID as key to avoid duplicates $dates[$date][$post->ID] = $post; } // Sort array by key ksort($dates); }
Of course this is a very basic example that you will have to adapt to your use case.
Testing
vendor/bin/phpcs -p . --standard=PHPCompatibilityWP --extensions=php --runtime-set testVersion 7.2-