File: /var/www/html/formularioacademy.sumar.com.py/wp-content/plugins/forminator/library/class-core.php
<?php
/**
* Forminator Core
*
* @package Forminator
*/
if ( ! defined( 'ABSPATH' ) ) {
die();
}
/**
* Class Forminator_Core
*
* @since 1.0
*/
class Forminator_Core {
/**
* Forminator_Admin Instance
*
* @var Forminator_Admin
*/
public $admin;
/**
* Store modules objects
*
* @var array
*/
public $modules = array();
/**
* Store forms objects
*
* @var array
*/
public $forms = array();
/**
* Store fields objects
*
* @var array
*/
public $fields = array();
/**
* Store PRO fields
*
* @var array
*/
public $pro_fields = array();
/**
* Store field objects
*
* @var array
*/
private static $field_objects = array();
/**
* Plugin instance
*
* @var null
*/
private static $instance = null;
/**
* Return the plugin instance
*
* @since 1.0
* @return Forminator
*/
public static function get_instance() {
if ( is_null( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Forminator_Core constructor.
*
* @since 1.0
*/
public function __construct() {
// Include all necessary files.
$this->includes();
// First check if upgrade of data is needed.
Forminator_Upgrade::init();
if ( is_admin() ) {
// Initialize admin core.
$this->admin = new Forminator_Admin();
new Forminator_Shortcode_Generator();
add_action( 'wp_head', array( $this, 'localize_pointers' ) );
}
// Get enabled modules.
$modules = new Forminator_Modules();
$this->modules = $modules->get_modules();
// Get enabled fields.
$fields = new Forminator_Fields();
$this->fields = $fields->get_fields();
$this->set_field_objects();
/**
* Filter Pro fields for promotion PRO version
*
* @since 1.13
* @param array $pro_fields Array of PRO fields e.g. [ 'field_type' => 'test', 'name' => 'test, 'icon' => 'sui-icon-pencil' ].
*/
$this->pro_fields = apply_filters( 'forminator_pro_fields', array() );
// HACK: Add settings and entries page at the end of the list.
if ( is_admin() ) {
$this->admin->add_templates_page();
$this->admin->add_entries_page();
$this->admin->add_addons_page();
if ( Forminator::is_addons_feature_enabled() ) {
$this->admin->add_integrations_page();
}
if ( forminator_global_tracking() ) {
$this->admin->add_reports_page();
}
$this->admin->add_settings_page();
if ( ! FORMINATOR_PRO ) {
$this->admin->add_upgrade_page();
}
// Call Mixpanel class.
new Forminator_Mixpanel();
}
// Protection management.
Forminator_Protection::get_instance();
// Export management.
Forminator_Export::get_instance();
if ( forminator_global_tracking() ) {
Forminator_Reports::get_instance();
}
// Post meta box.
add_action( 'init', array( &$this, 'post_field_meta_box' ) );
// Clean up Action Scheduler.
add_action( 'init', array( $this, 'schedule_action_scheduler_cleanup' ), 999 );
add_action( 'forminator_action_scheduler_cleanup', array( &$this, 'action_scheduler_cleanup' ) );
}
/**
* Set field objects
*/
private function set_field_objects() {
if ( self::$field_objects ) {
return;
}
foreach ( $this->fields as $field_object ) {
self::$field_objects[ $field_object->slug ] = $field_object;
}
}
/**
* Get field object by field type
*
* @param string $type Field type.
* @return object
*/
public static function get_field_object( $type ) {
$object = isset( self::$field_objects[ $type ] ) ? self::$field_objects[ $type ] : null;
return $object;
}
/**
* Get field types
*
* @return array
*/
public static function get_field_types() {
$types = array_keys( self::$field_objects );
return $types;
}
/**
* Get field type based on $element_id
*
* @param string $element_id Field slug.
* @return array
*/
public static function get_field_type( $element_id ) {
$field_type = '';
$parts = explode( '-', $element_id );
// all avail fields on library.
$field_types = self::get_field_types();
if ( in_array( $parts[0], $field_types, true ) ) {
$field_type = $parts[0];
}
return $field_type;
}
/**
* Includes
*
* @since 1.0
*/
private function includes() {
// Abstracts.
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/abstracts/abstract-class-field.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/abstracts/abstract-class-form-result.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/abstracts/abstract-class-form-template.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/abstracts/abstract-class-front-action.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/abstracts/abstract-class-mail.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/abstracts/abstract-class-payment-gateway.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/abstracts/abstract-class-spam-protection.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/abstracts/abstract-class-user.php';
// Classes.
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/class-loader.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/class-modules.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/class-form-fields.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/class-database-tables.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/class-upgrade.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/class-geo.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/class-protection.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/class-shortcode-generator.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/class-export-result.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/class-export.php';
include_once forminator_plugin_dir() . 'library/class-template-api.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/class-reports.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/render/class-render-form.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/render/class-assets-enqueue.php';
/* @noinspection PhpIncludeInspection */
if ( version_compare( PHP_VERSION, '5.3.0', 'ge' ) && file_exists( forminator_plugin_dir() . 'library/gateways/class-paypal-express.php' ) ) {
include_once forminator_plugin_dir() . 'library/gateways/class-paypal-express.php';
}
if ( version_compare( PHP_VERSION, '5.6.0', 'ge' ) && file_exists( forminator_plugin_dir() . 'library/gateways/class-stripe.php' ) ) {
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/gateways/class-stripe.php';
}
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/render/class-widget.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/class-captcha-verification.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/class-migration.php';
// Models.
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/model/class-form-entry-model.php';
// Helpers.
include_once forminator_plugin_dir() . 'library/helpers/encryption.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/helpers/helper-core.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/helpers/helper-importer.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/helpers/helper-modules.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/helpers/helper-forms.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/helpers/helper-fields.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/helpers/helper-google-fonts.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/helpers/helper-mail.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/helpers/helper-currency.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/helpers/helper-autofill.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/helpers/helper-calculator.php';
if ( version_compare( PHP_VERSION, '5.6.0', 'ge' ) ) {
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/helpers/helper-payment.php';
}
// Model.
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/model/class-base-form-model.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/model/class-custom-form-model.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/model/class-form-field-model.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/model/class-poll-form-model.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/model/class-quiz-form-model.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/model/class-form-views-model.php';
include_once forminator_plugin_dir() . 'library/model/class-form-reports-model.php';
if ( is_admin() ) {
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'admin/abstracts/class-admin-page.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'admin/abstracts/class-admin-view-page.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'admin/abstracts/class-admin-module-edit-page.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'admin/abstracts/class-admin-module.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'admin/abstracts/class-admin-import-mediator.php';
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'admin/classes/class-admin.php';
/* @noinspection PhpIncludeInspection */
if ( ! class_exists( 'WP_List_Table' ) ) {
/* @noinspection PhpIncludeInspection */
require_once ABSPATH . 'wp-admin/includes/class-wp-screen.php';// added.
/* @noinspection PhpIncludeInspection */
require_once ABSPATH . 'wp-admin/includes/screen.php';// added.
/* @noinspection PhpIncludeInspection */
require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
/* @noinspection PhpIncludeInspection */
require_once ABSPATH . 'wp-admin/includes/template.php';
}
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/mixpanel/class-mixpanel.php';
}
if ( Forminator::is_internal_page_cache_support_enabled() ) {
/* @noinspection PhpIncludeInspection */
include_once forminator_plugin_dir() . 'library/class-page-cache.php';
}
}
/**
* Start creating meta box for the posts
*
* @since 1.0
*/
public function post_field_meta_box() {
add_action( 'add_meta_boxes', array( $this, 'setup_post_meta_box' ) );
}
/**
* Setup the meta box
*
* @since 1.0
*/
public function setup_post_meta_box() {
global $post;
if ( is_object( $post ) ) {
$is_forminator_meta = get_post_meta( $post->ID, '_has_forminator_meta' );
if ( $is_forminator_meta ) {
add_meta_box(
'forminator-post-meta-box',
esc_html__( 'Post Custom Data', 'forminator' ),
array( $this, 'render_post_meta_box' ),
$post->post_type,
'normal',
'default'
);
}
}
}
/**
* Localize pointers
*
* @return void
*/
public function localize_pointers() {
?>
<script type="text/javascript">
var ajaxurl = '<?php echo esc_url( admin_url( 'admin-ajax.php' ) ); ?>';
</script>
<?php
}
/**
* Render Meta box
*
* @param WP_Post $post Post.
*
* @since 1.0
*/
public function render_post_meta_box( $post ) {
$meta_values = get_post_custom( $post->ID );
?>
<table class="widefat">
<tbody>
<?php
foreach ( $meta_values as $key => $value ) {
if ( '_' === $key[0] ) {
continue;
}
$value = $value[0];
?>
<tr>
<th><?php echo esc_html( $key ); ?></th>
<td><?php echo esc_html( $value ); ?></td>
</tr>
<?php
}
?>
</tbody>
</table>
<?php
}
/**
* Sanitize
*
* @param string $key POST key.
* @param mixed $default_value Default value.
* @return mixed
*/
public static function sanitize_text_field( $key, $default_value = '' ) {
if ( ! empty( $_POST[ $key ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
$value = sanitize_text_field( wp_unslash( $_POST[ $key ] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
} elseif ( ! empty( $_GET[ $key ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
$value = sanitize_text_field( wp_unslash( $_GET[ $key ] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
} else {
$value = $default_value;
}
if ( 'page' === $key ) {
$value = esc_attr( $value );
}
return $value;
}
/**
* Recursively sanitize data
*
* @param array $data Data.
* @param string $current_key Current key.
*
* @return array|string
*/
public static function sanitize_array( $data, $current_key = '' ) {
$data = wp_unslash( $data );
$skipped_keys = array( 'preview_data' );
// TODO: Should skip fields that has its own sanitize function.
if (
in_array( $current_key, $skipped_keys, true ) ||
0 === strpos( $current_key, 'url-' ) ||
0 === strpos( $current_key, 'select-' ) ||
0 === strpos( $current_key, 'checkbox-' ) ||
0 === strpos( $current_key, 'password-' ) ||
0 === strpos( $current_key, 'confirm_password-' )
) {
return $data;
}
$allow_html = array(
'variations',
'question_description',
'thankyou-message',
'email-thankyou-message',
'manual-thankyou-message',
'user-email-editor',
'admin-email-editor',
'quiz_description',
'question_description',
'email-editor',
'email-editor-method-email',
'email-editor-method-manual',
'msg_count',
'confirm-password-description',
'description',
'consent_description',
'hc_invisible_notice',
'options_bulk_editor',
'label',
'value',
'importable',
'sc_message',
'hidden-registration-form-message',
'hidden-login-form-message',
'footer_value',
'payee_info',
'payer_info',
'payment_note',
);
if (
in_array( $current_key, $allow_html, true ) ||
0 === strpos( $current_key, 'html-' ) ||
0 === strpos( $current_key, 'textarea-' ) ||
0 === strpos( $current_key, 'radio-' ) ||
false !== strpos( $current_key, '-post-title' ) ||
false !== strpos( $current_key, '-post-content' ) ||
false !== strpos( $current_key, '-post-excerpt' )
) {
return trim( wp_kses_post( $data ) );
}
// Allow line breaks.
$allow_linebreaks = array(
'custom_css',
'placeholder',
);
if ( in_array( $current_key, $allow_linebreaks, true ) ) {
return sanitize_textarea_field( $data );
}
// Cannot use esc_url_raw coz it strips curly braces.
if ( 'redirect-url' === $current_key ) {
return trim( wp_strip_all_tags( $data ) );
}
if ( ! is_array( $data ) ) {
return sanitize_text_field( $data );
} else {
foreach ( $data as $key => $value ) {
$data[ $key ] = self::sanitize_array( $value, $key );
}
return $data;
}
}
/**
* Recursively sanitize html data
*
* @param array $data Data.
*
* @return array|string
*/
public static function sanitize_html_array( $data ) {
if ( ! is_array( $data ) ) {
return esc_html( $data );
} else {
foreach ( $data as $key => $value ) {
$data[ $key ] = self::sanitize_html_array( $value );
}
return $data;
}
}
/**
* Shedule the Action Scheduler cleanup every hour.
*
* @return mixed
*/
public function schedule_action_scheduler_cleanup() {
// Create new schedule using AS.
if ( false === as_has_scheduled_action( 'forminator_action_scheduler_cleanup' ) ) {
as_schedule_recurring_action( time(), HOUR_IN_SECONDS * 2, 'forminator_action_scheduler_cleanup', array(), 'forminator', true );
}
}
/**
* Delete Action Scheduler actions and logs of Forminator.
*
* @param null|string $db_prefix DB Prefix.
*
* @return void
*/
public static function action_scheduler_cleanup( $db_prefix = null ) {
global $wpdb;
$is_uninstall = false;
// If null, its being called by AS action hook.
if ( is_null( $db_prefix ) ) {
$db_prefix = $wpdb->prefix;
} else {
// Plugin is being uninstalled, unschedule all and all forminator scheduled actions.
$is_uninstall = true;
}
$table_actions = $db_prefix . 'actionscheduler_actions';
$table_logs = $db_prefix . 'actionscheduler_logs';
$table_groups = $db_prefix . 'actionscheduler_groups';
$slug = 'forminator';
$group_id = (int) $wpdb->get_var( $wpdb->prepare( "SELECT group_id FROM {$table_groups} WHERE slug = %s", $slug ) ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery
$and = '';
// If not uninstall, do not delete pending tasks.
if ( ! $is_uninstall ) {
$and = "AND ( as_actions.status = 'complete' || as_actions.status = 'failed' || as_actions.status = 'canceled' )";
}
// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQL.NotPrepared
$query = $wpdb->prepare(
"SELECT action_id
FROM {$table_actions} as_actions
WHERE as_actions.group_id = %s
" . $and . '
LIMIT 100',
$group_id
);
// phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQL.NotPrepared
// Delete all AS forminator actions and logs.
while ( $action_ids = $wpdb->get_col( $query ) ) { // phpcs:ignore Generic.CodeAnalysis.AssignmentInCondition.FoundInWhileCondition, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery
if ( empty( $action_ids ) ) {
break;
}
$where_in = implode(
', ',
array_fill(
0,
is_array( $action_ids ) || $action_ids instanceof \Countable ? count( $action_ids ) : 0,
'%s'
)
);
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
$wpdb->query(
// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
$wpdb->prepare(
"DELETE as_actions, as_logs
FROM {$table_actions} as_actions
LEFT JOIN {$table_logs} as_logs
ON as_actions.action_id = as_logs.action_id
WHERE as_actions.action_id IN ( {$where_in} )",
$action_ids
)
// phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
);
}
}
}