| 1 | <?php
|
| 2 | /**
|
| 3 | * Plugin Name: Polylang/WPBakery image filter fix
|
| 4 | * Description: A plugin that fixes the disappearing images issue when using WPBakery and Polylang together and NOT translating the Media Library
|
| 5 | * Version: 1.0.0
|
| 6 | * Author: ellmann creative
|
| 7 | */
|
| 8 |
|
| 9 | if (!function_exists('is_plugin_active')) { include_once(ABSPATH . 'wp-admin/includes/plugin.php'); }
|
| 10 | add_action('init', function(){
|
| 11 | $selfDisableFunction = function($s){
|
| 12 | deactivate_plugins( plugin_basename( __FILE__ ) );
|
| 13 | if ( isset( $_GET['activate'] ) )
|
| 14 | unset( $_GET['activate'] );
|
| 15 |
|
| 16 | define("ec_wpbakery_polylang_fix_notice_content", $s);
|
| 17 | add_action( 'admin_notices', function(){
|
| 18 | echo "<div class=\"notice-info is-dismissible\"><p><strong>Polylang/WPBakery image filter fix</strong>: " .
|
| 19 | ec_wpbakery_polylang_fix_notice_content . " We're disabling the plugin.</p></div>";
|
| 20 | });
|
| 21 | };
|
| 22 |
|
| 23 | if ( !is_plugin_active('polylang/polylang.php') ){
|
| 24 | $selfDisableFunction("it seems that Polylang is not present or enabled in your installation.");
|
| 25 | return; |
| 26 | }
|
| 27 |
|
| 28 | # Polylang is present and active, then
|
| 29 | if ( get_option('polylang')['media_support'] !== false ){
|
| 30 | $selfDisableFunction("your Polylang configuration seems to be just fine (or else you're experiencing a different bug).");
|
| 31 | return; |
| 32 | }
|
| 33 |
|
| 34 | if ( !function_exists('icl_object_id') ){
|
| 35 | $selfDisableFunction("looks like the problematic code was removed from your version of Polylang.");
|
| 36 | return; |
| 37 | }
|
| 38 |
|
| 39 | # okay, Polylang is present, active, and NOT handling the Media Library
|
| 40 | # ... so, let's test if it's breaking it instead?
|
| 41 | $attachments = new WP_Query( ['post_type' => 'attachment', 'posts_per_page'=> 1, 'post_status' => 'any'] );
|
| 42 | if ( !$attachments->have_posts() )
|
| 43 | return; |
| 44 |
|
| 45 | # we have media; time to test the first one
|
| 46 | $testPostID = $attachments->posts[0]->ID;
|
| 47 | $filteredPostID = icl_object_id($testPostID, 'post');
|
| 48 |
|
| 49 | if ( $testPostID != $filteredPostID || $filteredPostID === null ) {
|
| 50 | # the bug was triggered!
|
| 51 | if ( !is_admin() ){
|
| 52 | # fix it (in the front-end)
|
| 53 | remove_filter('wpml_object_id', 'icl_object_id', 10, 4);
|
| 54 | add_filter( 'wpml_object_id', 'icl_object_id_patched', 10, 4);
|
| 55 | }
|
| 56 | } else if ( is_admin() ) {
|
| 57 | # the bug was NOT triggered, so we can display a notification and disable ourselves, actually
|
| 58 | $selfDisableFunction("it looks like your version of Polylang isn't affected by the bug this patch aims to fix.");
|
| 59 | }
|
| 60 | });
|
| 61 |
|
| 62 | function icl_object_id_patched( $id, $type = 'post', $return_original_if_missing = false, $lang = '' ) {
|
| 63 | $lang = $lang ? $lang : pll_current_language();
|
| 64 |
|
| 65 | if ( 'nav_menu' === $type ) {
|
| 66 | $theme = get_option( 'stylesheet' );
|
| 67 | if ( isset( PLL()->options['nav_menus'][ $theme ] ) ) {
|
| 68 | foreach ( PLL()->options['nav_menus'][ $theme ] as $menu ) {
|
| 69 | if ( array_search( $id, $menu ) && ! empty( $menu[ $lang ] ) ) {
|
| 70 | $tr_id = $menu[ $lang ];
|
| 71 | break;
|
| 72 | }
|
| 73 | }
|
| 74 | }
|
| 75 | } elseif ( $pll_type = ( 'post' === $type || pll_is_translated_post_type( $type ) ) ? 'post' : ( 'term' === $type || pll_is_translated_taxonomy( $type ) ? 'term' : false ) ) {
|
| 76 | $tr_id = PLL()->model->$pll_type->get_translation( $id, $lang );
|
| 77 | }
|
| 78 |
|
| 79 | # patch
|
| 80 | if ( 'attachment' === get_post_type( $id )
|
| 81 | && get_option('polylang')['media_support'] === false ){
|
| 82 | $return_original_if_missing = true;
|
| 83 | }
|
| 84 |
|
| 85 | return ! empty( $tr_id ) ? $tr_id : ( $return_original_if_missing ? $id : null );
|
| 86 | # /patch
|
| 87 | }
|
| 88 |
|
| 89 | |