xmlrpc_init(); $compressor = $settings->get_compressor(); if ( $compressor ) { $compressor->compress_file( $cropped_path['path'], false, false ); } } catch ( Exception $e ) { // } } } add_action( 'fl_builder_photo_cropped', 'fl_builder_tinypng_support', 10, 2 ); /** * Support for WooCommerce Memberships. * * Makes sure builder content isn't rendered for protected posts. */ function fl_builder_wc_memberships_support() { if ( function_exists( 'wc_memberships_is_post_content_restricted' ) ) { function fl_builder_wc_memberships_maybe_render_content( $do_render, $post_id ) { if ( wc_memberships_is_post_content_restricted() ) { // check if user has access to restricted content if ( ! current_user_can( 'wc_memberships_view_restricted_post_content', $post_id ) ) { $do_render = false; } elseif ( ! current_user_can( 'wc_memberships_view_delayed_post_content', $post_id ) ) { $do_render = false; } } return $do_render; } add_filter( 'fl_builder_do_render_content', 'fl_builder_wc_memberships_maybe_render_content', 10, 2 ); } } add_action( 'plugins_loaded', 'fl_builder_wc_memberships_support', 11 ); /** * Support for Option Tree. * * Older versions of Option Tree don't declare the ot_get_media_post_ID * function on the frontend which is needed for the media uploader and * throws an error if it doesn't exist. */ function fl_builder_option_tree_support() { if ( ! function_exists( 'ot_get_media_post_ID' ) ) { function ot_get_media_post_ID() { // @codingStandardsIgnoreLine // Option ID $option_id = 'ot_media_post_ID'; // Get the media post ID $post_id = get_option( $option_id, false ); // Add $post_ID to the DB if ( false === $post_id ) { global $wpdb; // Get the media post ID $post_id = $wpdb->get_var( "SELECT ID FROM $wpdb->posts WHERE `post_title` = 'Media' AND `post_type` = 'option-tree' AND `post_status` = 'private'" ); // Add to the DB add_option( $option_id, $post_id ); } return $post_id; } } } add_action( 'after_setup_theme', 'fl_builder_option_tree_support' ); /** * If FORCE_SSL_ADMIN is enabled but the frontend is not SSL fixes a CORS error when trying to upload a photo. * `add_filter( 'fl_admin_ssl_upload_fix', '__return_false' );` will disable. * * @since 1.10.2 */ function fl_admin_ssl_upload_fix() { if ( defined( 'FORCE_SSL_ADMIN' ) && ! is_ssl() && is_admin() && FLBuilderAJAX::doing_ajax() ) { if ( isset( $_POST['action'] ) && 'upload-attachment' === $_POST['action'] && true === apply_filters( 'fl_admin_ssl_upload_fix', true ) ) { force_ssl_admin( false ); } } } add_action( 'plugins_loaded', 'fl_admin_ssl_upload_fix', 11 ); /** * Disable support Buddypress pages since it's causing conflicts with `the_content` filter * * @param bool $is_editable Wether the post is editable or not * @param $post The post to check from * @return bool */ function fl_builder_bp_pages_support( $is_editable, $post = false ) { // Frontend check if ( ! is_admin() && class_exists( 'BuddyPress' ) && ! bp_is_blog_page() ) { $is_editable = false; } // Admin rows action link check and applies to page list if ( is_admin() && class_exists( 'BuddyPress' ) && $post && 'page' == $post->post_type ) { $bp = buddypress(); if ( $bp->pages ) { foreach ( $bp->pages as $page ) { if ( $post->ID == $page->id ) { $is_editable = false; break; } } } } return $is_editable; } add_filter( 'fl_builder_is_post_editable', 'fl_builder_bp_pages_support', 11, 2 ); /** * There is an issue with Jetpack Photon and circle cropped photo module * returning the wrong image sizes from the bb cache folder. * This filter disables photon for circle cropped photo module images. */ function fl_photo_photon_exception( $val, $src, $tag ) { // Make sure its a bb cached image. if ( false !== strpos( $src, 'bb-plugin/cache' ) ) { // now make sure its a circle cropped image. if ( false !== strpos( basename( $src ), '-circle' ) ) { return apply_filters( 'fl_photo_photon_exception', true ); } } // return original val return $val; } add_filter( 'jetpack_photon_skip_image', 'fl_photo_photon_exception', 10, 3 ); /** * WordPress pre 4.5 we need to make sure that ui-core|widget|mouse are loaded before sortable. */ function fl_before_sortable_enqueue_callback() { if ( version_compare( get_bloginfo( 'version' ), '4.5', '<' ) ) { wp_deregister_script( 'jquery-ui-widget' ); wp_deregister_script( 'jquery-ui-mouse' ); wp_deregister_script( 'jquery-ui-core' ); wp_enqueue_script( 'jquery-ui-core', site_url( '/wp-includes/js/jquery/ui/core.min.js' ), array( 'jquery' ), '1.8.12' ); wp_enqueue_script( 'jquery-ui-widget', site_url( '/wp-includes/js/jquery/ui/widget.min.js' ), array( 'jquery' ), '1.8.12' ); wp_enqueue_script( 'jquery-ui-mouse', site_url( '/wp-includes/js/jquery/ui/mouse.min.js' ), array( 'jquery' ), '1.8.12' ); } } add_action( 'fl_before_sortable_enqueue', 'fl_before_sortable_enqueue_callback' ); /** * Try to unserialize data normally. * Uses a preg_callback to fix broken data caused by serialized data that has broken offsets. * * @since 1.10.6 * @param string $data unserialized string * @return array */ function fl_maybe_fix_unserialize( $data ) { // @codingStandardsIgnoreStart $unserialized = @unserialize( $data ); // @codingStandardsIgnoreEnd if ( ! $unserialized ) { $unserialized = unserialize( preg_replace_callback( '!s:(\d+):"(.*?)";!', 'fl_maybe_fix_unserialize_callback', $data ) ); } return $unserialized; } /** * Callback function for fl_maybe_fix_unserialize() * * @since 1.10.6 */ function fl_maybe_fix_unserialize_callback( $match ) { return ( strlen( $match[2] ) == $match[1] ) ? $match[0] : 's:' . strlen( $match[2] ) . ':"' . $match[2] . '";'; } /** * Filter rendered module content and if safemode is active safely display a message. * @since 1.10.7 */ function fl_builder_render_module_content_filter( $contents, $module ) { if ( isset( $_GET['safemode'] ) && FLBuilderModel::is_builder_active() ) { return sprintf( '

[%1$s] %2$s %3$s

', __( 'SAFEMODE', 'fl-builder' ), $module->name, __( 'module', 'fl-builder' ) ); } else { return $contents; } } add_filter( 'fl_builder_render_module_content', 'fl_builder_render_module_content_filter', 10, 2 ); /** * Duplicate posts plugin fixes when cloning BB template. * * @since 1.10.8 * @param int $meta_id The newly added meta ID * @param int $object_id ID of the object metadata is for. * @param string $meta_key Metadata key * @param string $meta_value Metadata value * @return void */ function fl_builder_template_meta_add( $meta_id, $object_id, $meta_key, $meta_value ) { global $pagenow; if ( 'admin.php' != $pagenow ) { return; } if ( ! isset( $_REQUEST['action'] ) || 'duplicate_post_save_as_new_post' != $_REQUEST['action'] ) { return; } $post_type = get_post_type( $object_id ); if ( 'fl-builder-template' != $post_type || '_fl_builder_template_id' != $meta_key ) { return; } // Generate new template ID; $template_id = FLBuilderModel::generate_node_id(); update_post_meta( $object_id, '_fl_builder_template_id', $template_id ); } add_action( 'added_post_meta', 'fl_builder_template_meta_add', 10, 4 ); /** * Stop bw-minify from optimizing when builder is open. * @since 1.10.9 */ function fl_bwp_minify_is_loadable_filter( $args ) { if ( FLBuilderModel::is_builder_active() ) { return false; } return $args; } add_filter( 'bwp_minify_is_loadable', 'fl_bwp_minify_is_loadable_filter' ); /** * Stop autoptimize from optimizing when builder is open. * @since 1.10.9 */ function fl_autoptimize_filter_noptimize_filter( $args ) { if ( FLBuilderModel::is_builder_active() ) { return true; } return $args; } add_filter( 'autoptimize_filter_noptimize', 'fl_autoptimize_filter_noptimize_filter' ); /** * Fixes an issue on search archives if one of the results contains same shortcode * as is currently trying to render. * * @since 1.10.9 * @param bool $render Render shortcode. * @param array $attrs Shortcode attributes. * @param array $args Passed to FLBuilder::render_query * @return bool */ function fl_builder_insert_layout_render_search( $render, $attrs, $args ) { global $post, $wp_query; if ( is_search() && is_object( $post ) && is_array( $wp_query->posts ) ) { foreach ( $wp_query->posts as $queried_post ) { if ( $post->ID === $queried_post->ID ) { preg_match( '#(?<=fl_builder_insert_layout).*[id|slug]=[\'"]?([0-9a-z-]+)#', $post->post_content, $matches ); if ( isset( $matches[1] ) ) { return false; } } } } return $render; } add_action( 'fl_builder_insert_layout_render', 'fl_builder_insert_layout_render_search', 10, 3 ); /** * Fixes ajax issues with Event Espresso plugin when builder is open. * @since 2.1 */ function fl_ee_suppress_notices() { if ( FLBuilderModel::is_builder_active() ) { add_filter( 'FHEE__EE_Front_Controller__display_errors', '__return_false' ); } } add_action( 'wp', 'fl_ee_suppress_notices' ); /** * Stops ee from outputting HTML into our ajax responses. * @since 2.1 */ function fl_ee_before_ajax() { add_filter( 'FHEE__EE_Front_Controller__display_errors', '__return_false' ); } add_action( 'fl_ajax_before_call_action', 'fl_ee_before_ajax' ); /** * Plugin Enjoy Instagram loads its js and css on all frontend pages breaking the builder. * @since 2.0.1 */ add_action( 'template_redirect', 'fix_aggiungi_script_instafeed_owl', 1000 ); function fix_aggiungi_script_instafeed_owl() { if ( FLBuilderModel::is_builder_active() ) { remove_action( 'wp_enqueue_scripts', 'aggiungi_script_instafeed_owl' ); } } /** * Siteground cache captures shutdown and breaks our dynamic js loading. * @since 2.0.4.2 */ add_action( 'plugins_loaded', 'fl_fix_sg_cache', 9 ); function fl_fix_sg_cache() { if ( isset( $_GET['fl_builder_load_settings_config'] ) ) { remove_action( 'plugins_loaded', 'sg_cachepress_start' ); } } /** * Remove Activemember360 shortcodes from saved post content to stop them rendering twice. * @since 2.0.6 */ add_filter( 'fl_builder_editor_content', 'fl_activemember_shortcode_fix' ); function fl_activemember_shortcode_fix( $content ) { return preg_replace( '#\[mbr.*?\]#', '', $content ); } /** * Remove iMember360 shortcodes from saved post content to stop them rendering twice. * @since 2.0.6 */ add_filter( 'fl_builder_editor_content', 'fl_imember_shortcode_fix' ); function fl_imember_shortcode_fix( $content ) { return preg_replace( '#\[i4w.*?\]#', '', $content ); } /** * Fix javascript issue caused by nextgen gallery when adding modules in the builder. * @since 2.0.6 */ add_action( 'plugins_loaded', 'fl_fix_nextgen_gallery' ); function fl_fix_nextgen_gallery() { if ( isset( $_GET['fl_builder'] ) || isset( $_POST['fl_builder_data'] ) || FLBuilderAJAX::doing_ajax() ) { define( 'NGG_DISABLE_RESOURCE_MANAGER', true ); } } /** * Fix Tasty Recipes compatibility issues with the builder. * @since 2.0.6 */ add_action( 'template_redirect', 'fl_fix_tasty_recipes' ); function fl_fix_tasty_recipes() { if ( FLBuilderModel::is_builder_active() ) { remove_action( 'wp_enqueue_editor', array( 'Tasty_Recipes\Assets', 'action_wp_enqueue_editor' ) ); remove_action( 'media_buttons', array( 'Tasty_Recipes\Editor', 'action_media_buttons' ) ); } } /** * Dequeue GeneratePress fa5 js when builder is open. * @since 2.1 */ add_action( 'template_redirect', 'fl_fix_generatepress_fa5' ); function fl_fix_generatepress_fa5() { if ( FLBuilderModel::is_builder_active() ) { add_filter( 'generate_fontawesome_essentials', '__return_true' ); } } /** * Try to render Ninja Forms JS templates when rendering an AJAX layout * in case the layout includes one of their shortcodes. This won't do * anything if no templates need to be rendered. * @since 2.1 */ add_filter( 'fl_builder_ajax_layout_response', 'fl_render_ninja_forms_js' ); function fl_render_ninja_forms_js( $response ) { if ( class_exists( 'NF_Display_Render' ) ) { ob_start(); NF_Display_Render::output_templates(); $response['html'] .= ob_get_clean(); } return $response; } /** * Reorder font awesome css. * @since 2.1 */ function fl_builder_fa_fix() { global $wp_styles; $queue = $wp_styles->queue; $fa4 = array_search( 'font-awesome', $queue ); $fa5 = array_search( 'font-awesome-5', $queue ); // if fa4 is disabled and both are detected, load fa4 FIRST. if ( false !== $fa4 && false !== $fa5 && $fa4 > $fa5 && ! in_array( 'font-awesome', FLBuilderModel::get_enabled_icons() ) ) { unset( $wp_styles->queue[ $fa4 ] ); array_unshift( $wp_styles->queue, 'font-awesome' ); } // If fa4 is detected, add a compatibility layer in the footer. // This fixes various theme/themer issues. if ( false !== $fa4 ) { add_action( 'wp_footer', 'fl_builder_fa_fix_callback' ); } } add_action( 'wp_enqueue_scripts', 'fl_builder_fa_fix', 99999 ); function fl_builder_fa_fix_callback() { echo ''; } /** * Turn off Hummingbird minification * @since 2.1 */ add_action( 'template_redirect', 'fl_fix_hummingbird' ); function fl_fix_hummingbird() { if ( FLBuilderModel::is_builder_active() ) { add_filter( 'wp_hummingbird_is_active_module_minify', '__return_false', 500 ); } } /** * Fix Enjoy Instagram feed on website with WordPress Widget and Shortcode issues with the builder. * @since 2.0.6 */ add_action( 'template_redirect', 'fl_fix_enjoy_instagram' ); function fl_fix_enjoy_instagram() { if ( FLBuilderModel::is_builder_active() ) { remove_action( 'wp_head', 'funzioni_in_head' ); } }