38217-vm/wp-content/plugins/fusion-builder/inc/class-fusion-form-export-single-form.php
2026-02-05 17:08:59 +03:00

135 lines
3.6 KiB
PHP

<?php
/**
* Handles the single form export.
*
* @package fusion-builder
* @since 3.1
*/
/**
* Create a new class to handle single form export through WP Export.
*
* @since 3.1
*/
class Fusion_Form_Export_Single_Form {
/**
* Fake form date.
*
* @since 3.1
* @var date
*/
public $fake_date;
/**
* Class constructor.
*
* @since 3.1
* @access public
*/
public function __construct() {
// Due to a lack of hooks, we're using what we hope is an unlikely date match.
$this->fake_date = '1970-01-05'; // Y-m-d.
add_action( 'init', [ $this, 'init' ] );
}
/**
* Add actions and filters for export.
*
* @since 3.1
* @access public
* @return void
*/
public function init() {
if ( current_user_can( 'export' ) ) {
add_filter( 'export_args', [ $this, 'export_args' ] );
add_filter( 'query', [ $this, 'query' ] );
add_filter( 'export_wp_filename', [ $this, 'fusion_form_export_filename' ], 10 );
}
}
/**
* Modify export arguments,
* except if normal export.
*
* @param array $args Query args for determining what should be exported.
* @return $args Modified query
*/
public function export_args( $args ) {
// If no export_form var, it's a normal export - don't interfere.
if ( ! isset( $_GET['export_form'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
return $args;
}
// Use our fake date so the query is easy to find (because we don't have a good hook to use).
$args['content'] = 'post';
$args['start_date'] = $this->fake_date;
$args['end_date'] = $this->fake_date;
return $args;
}
/**
* Filter query.
* Look for 'tagged' query, replace with one matching the needs.
*
* @param string $query SQL query.
* @return string Modified SQL query
*/
public function query( $query ) {
global $wpdb;
if ( ! isset( $_GET['export_form'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
return $query;
}
// This is the query WP will build (given our arg filtering above)
// Since the current_filter isn't narrow, we'll check each query
// to see if it matches, then if it we replace it.
$test = $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE {$wpdb->posts}.post_type = 'post' AND {$wpdb->posts}.post_status != 'auto-draft' AND {$wpdb->posts}.post_date >= %s AND {$wpdb->posts}.post_date < %s",
gmdate( 'Y-m-d', strtotime( $this->fake_date ) ),
gmdate( 'Y-m-d', strtotime( '+1 month', strtotime( $this->fake_date ) ) )
);
if ( $test !== $query ) {
return $query;
}
// Divide query.
$split = explode( 'WHERE', $query );
$form_ids = (array) wp_unslash( $_GET['export_form'] ); // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput
$form_ids = array_map( 'intval', $form_ids );
$form_ids_var = implode( "','", $form_ids );
// Replace WHERE clause.
$split[1] = $wpdb->prepare( " {$wpdb->posts}.ID IN (%s)", $form_ids_var );
$split[1] = stripcslashes( $split[1] );
// Put query back together.
$query = implode( 'WHERE', $split );
return $query;
}
/**
* Export Filename for elements/templates
*
* @param string $wp_filename Export file name.
* @return string $wp_filename New export file name depends on the post type
*/
public function fusion_form_export_filename( $wp_filename ) {
if ( isset( $_GET['export_form'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
$form_ids = (array) wp_unslash( $_GET['export_form'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput, WordPress.Security.NonceVerification
$form_ids = implode( '-', $form_ids );
$wp_filename = 'fusion_form[' . $form_ids . ']-export.xml';
}
return $wp_filename;
}
}