Current File : /home/resuelf/www/wp-content/plugins/nitropack/classes/Integration/Plugin/TheEventsCalendar.php
<?php
/**
 * TheEventsCalendar Class
 *
 * @package nitropack
 */

namespace NitroPack\Integration\Plugin;

if ( ! function_exists( 'is_plugin_active' ) ) {
	include_once ABSPATH . 'wp-admin/includes/plugin.php';
}

/**
 * TheEventsCalendar Class
 */
class TheEventsCalendar {

	const STAGE = 'early';

	const WIDGET_ID = 'tribe-widget-events-list';

	/**
	 * Check if plugin "The Events Calendar" is active
	 *
	 * @return bool
	 */
	public static function isActive() {     //phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid
		return is_plugin_active( 'the-events-calendar/the-events-calendar.php' );
	}

	/**
	 * Initialize the integration
	 *
	 * @param string $stage Stage.
	 *
	 * @return void
	 */
	public function init( $stage ) {  //phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found
		if ($this -> isActive()) {

            if (!wp_doing_ajax()) {
	            add_filter( 'dynamic_sidebar_params', [$this, 'filter_dynamic_sidebar_params'] );
	            add_filter( 'widget_output', [$this, 'widget_output_filter'], 10, 4 );
            }
			add_action( 'wp_ajax_nitropack_widget_output_ajax', [$this, 'widget_output_ajax'] );
			add_action( 'wp_ajax_nopriv_nitropack_widget_output_ajax', [$this, 'widget_output_ajax'] );
		}
	}

	/**
	 * Filter dynamic sidebar params
	 *
	 * @param array $sidebar_params Sidebar params.
	 *
	 * @return mixed
	 */
	public function filter_dynamic_sidebar_params( $sidebar_params ) {

		if ( is_admin() ) {
			return $sidebar_params;
		}

		global $wp_registered_widgets;
		$widget_id = $sidebar_params[0]['widget_id'];

		if ( strpos($widget_id, self::WIDGET_ID) !== false) {
			$wp_registered_widgets[ $widget_id ]['original_callback'] = $wp_registered_widgets[ $widget_id ]['callback'];
			$wp_registered_widgets[ $widget_id ]['callback'] = [$this, 'custom_widget_callback_function'];
		}
		return $sidebar_params;
	}

	/**
	 * Widget output filter
	 *
	 * @return void
	 */
	public function custom_widget_callback_function() {

		global $wp_registered_widgets;
		$original_callback_params = func_get_args();

		$widget_id         = $original_callback_params[0]['widget_id'];
		$original_callback = $wp_registered_widgets[ $widget_id ]['original_callback'];

		$wp_registered_widgets[ $widget_id ]['callback'] = $original_callback;

		$widget_id_base = $original_callback[0]->id_base;
		$sidebar_id     = $original_callback_params[0]['id'];

		if ( is_callable( $original_callback ) ) {

			ob_start();
			call_user_func_array( $original_callback, $original_callback_params );
			$widget_output = ob_get_clean();

			echo wp_kses_post(apply_filters( 'widget_output', $widget_output, $widget_id_base, $widget_id, $sidebar_id ));
		}
	}

	/**
	 * Filter the widget's output.
	 *
	 * @param string $widget_output  The widget's output.
	 * @param string $widget_id_base The widget's base ID.
	 * @param string $widget_id      The widget's full ID.
	 * @param string $sidebar_id     The current sidebar ID.
	 */
	public function widget_output_filter( $widget_output, $widget_id_base, $widget_id, $sidebar_id ) {

			wp_enqueue_script( 'nitropack-widget-ajax-script', NITROPACK_PLUGIN_DIR_URL . 'view/javascript/widgets_ajax.js?np_v=' . NITROPACK_VERSION, array('jquery'), NITROPACK_VERSION, true );
			wp_localize_script( 'nitropack-widget-ajax-script', 'nitropack_widget_ajax', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );

			ob_start();
			?>
			<div class="nitropack-widget-ajax" data-widget-id="<?php echo esc_attr($widget_id); ?>" data-sidebar-id="<?php echo esc_attr($sidebar_id); ?>"><img src="<?php echo esc_url(NITROPACK_PLUGIN_DIR_URL . 'view/images/loading.gif'); ?>" alt="loading" /></div>
			<?php
			$widget_output = ob_get_clean();

		    return $widget_output;
	}

    /**
     * Widget output ajax
     *
     * @return void
     */
	public function widget_output_ajax(){

		global $wp_registered_sidebars, $wp_registered_widgets;

        $widget_id = isset($_GET['widget_id']) ? sanitize_text_field(wp_unslash($_GET['widget_id'])) : ''; //phpcs:ignore WordPress.Security.NonceVerification.Recommended
		$sidebar_id = isset($_GET['sidebar_id']) ? sanitize_text_field(wp_unslash($_GET['sidebar_id'])) : ''; //phpcs:ignore WordPress.Security.NonceVerification.Recommended

	    if( !empty($widget_id) && isset($wp_registered_widgets[$widget_id]) && isset($wp_registered_sidebars[$sidebar_id]) && isset($wp_registered_widgets[$widget_id]["callback"])) {

	        $original_callback = $wp_registered_widgets[$widget_id]['callback'];

            $params = [];

		    $params[] = $wp_registered_sidebars[$sidebar_id];

		    if (isset($wp_registered_widgets[ $widget_id ]['params'][0])) {
			    $params[] = $wp_registered_widgets[ $widget_id ]['params'][0];
		    }

		    if (is_callable($original_callback)) {

		        call_user_func_array($original_callback, $params);
            }
        }

		wp_die();
	}
}