Skip to content

Instantly share code, notes, and snippets.

@goodmuyis
Forked from birgire/export-single-day.php
Created August 20, 2020 21:46
Show Gist options
  • Save goodmuyis/92c4a36a6e1874d93464ca87f7e2e9e9 to your computer and use it in GitHub Desktop.
Save goodmuyis/92c4a36a6e1874d93464ca87f7e2e9e9 to your computer and use it in GitHub Desktop.
WordPress Plugin: Enhance the native XML export - with a single day selection
<?php
/**
* Plugin Name: Single Day Posts Export
* Plugin URL: http://wordpress.stackexchange.com/a/199527/26350
* Plugin Author: Birgir Erlendsson (birgire)
* Version: 0.0.1
*/
/**
* Add our extra HTML
*/
add_action( 'export_filters', function() {
?>
<p>
<ul id="wpse-post-filters" class="wpse-export-filters">
<li>
<label><?php _e( 'Export posts from a single day:' ); ?></label>
<select name="wpse_single_day">
<option value="0"><?php _e( 'Select day' ); ?></option>
<?php wpse_export_single_day_options(); ?>
</select>
</li>
</ul>
</p>
<?php
});
/**
* Modification of the core export_date_options() function
*/
function wpse_export_single_day_options( $post_type = 'post' ) {
global $wpdb, $wp_locale;
$months = $wpdb->get_results(
$wpdb->prepare(
"SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month, Day( post_date ) as day
FROM {$wpdb->posts}
WHERE post_type = %s AND post_status != 'auto-draft'
ORDER BY post_date DESC",
$post_type
)
);
$month_count = count( $months );
if ( !$month_count || ( 1 == $month_count && 0 == $months[0]->month ) )
return;
foreach ( $months as $date )
{
if ( 0 == $date->year )
continue;
$month = zeroise( $date->month, 2 );
printf(
'<option value="%d-%d-%d">%d. %s %d</option>',
$date->year,
$month,
$date->day,
$date->day,
$wp_locale->get_month( $month ),
$date->year
);
}
}
/**
* Append our HTML to the post filter section
*/
add_action( 'admin_head', function(){
?>
<script>
jQuery(document).ready(function($){
$('#wpse-post-filters').appendTo( $('#post-filters') );
});
</script>
<?php
});
/**
* Modify the database queries, indirectly
*/
add_filter( 'export_args', function( $args )
{
// User input
$date = filter_input( INPUT_GET, 'wpse_single_day' );
// Let's use DateTime to validate the Y-m-d input,
// See here http://stackoverflow.com/a/13194441/2078474
$dt = DateTime::createFromFormat( 'Y-m-d', $date );
// Check if the user input is a valid date:
if( method_exists( $dt, 'format' ) && $Ymd = $dt->format( 'Y-m-d' ) )
{
// The from date for the db query:
$args['start_date'] = $Ymd;
// I think we can modify the end date, in the db query, with this little trick
$args['end_date'] = date(
'Y-m-d',
strtotime(
'-1 month',
strtotime(
'+1 day',
strtotime( $Ymd )
)
)
);
} // end if
return $args;
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment