• Hola a todos,

    Estoy buscando la forma de que mi Worpdress muestre las imagenes del tema que tengo activo en el formato adecuado segun el navegador que las visite y cuales soporte, ya sea webp, gif, jpeg…etc.

    De momento he probado con este codigo añadiendolo al final del archivo functions.php del tema:

    // Añade soporte para el formato de imagen WebP (no es necesario si usas WordPress 5.8 o superior)
    /*
    function add_webp_mime_type( $mimes ) {
      $mimes['webp'] = 'image/webp';
      return $mimes;
    }
    add_filter( 'mime_types', 'add_webp_mime_type' );
    */
    
    // Muestra las imágenes del tema activo en la misma carpeta que la imagen sidebar-bg.jpg
    function show_theme_images() {
      // Obtiene la URL de la carpeta de imágenes del tema activo
      $theme_directory = get_template_directory_uri() . '/wp-content/';
    
      // Define los formatos de imagen permitidos
      $image_formats = array( 'webp', 'jpeg', 'jpg', 'png', 'gif' );
    
      // Obtiene la ruta física de la carpeta de imágenes del tema activo
      $image_path = get_template_directory() . '/wp-content/';
    
      // Obtiene todas las imágenes válidas en la carpeta de imágenes del tema activo
      $images = get_images_in_directory( $image_path, $image_formats );
    
      if ( $images ) {
        foreach ( $images as $image ) {
          // Obtiene la URL y la ruta física de la imagen actual
          $image_url = $theme_directory . $image;
          $image_file = $image_path . $image;
    
          // Obtiene el tipo MIME de la imagen actual
          $mime_type = wp_check_filetype( $image_file )['type'];
    
          // Si el navegador admite el tipo MIME de la imagen actual, la muestra y sale del script
          if ( in_array( $mime_type, $image_formats ) ) {
            header( "Content-type: $mime_type" );
            readfile( $image_url );
            exit;
          }
        }
      }
    }
    
    // Obtiene todas las imágenes válidas en una carpeta dada
    function get_images_in_directory( $directory, $formats ) {
      $images = array();
    
      if ( is_dir( $directory ) ) {
        $files = scandir( $directory );
    
        foreach ( $files as $file ) {
          $path = $directory . $file;
          $extension = strtolower( pathinfo( $path, PATHINFO_EXTENSION ) );
    
          if ( in_array( $extension, $formats ) ) {
            $images[] = $file;
          }
        }
      }
    
      return $images;
    }
    
    // Agrega el script que muestra las imágenes del tema activo al inicio de la ejecución de WordPress
    add_action( 'init', 'show_theme_images' );

    Y he subido versiones en WebP con el mismo nombre a la carpeta del tema donde estan las versiones originales.

    El caso es que no he conseguido ningun resultado y no consigo averiguar porque, aunque he probado a variar la ruta de la carpeta de imagenes haciendola menos especifica por si fuera eso. Podriais echarme una mano?

    La página con la que necesito ayuda: [accede para ver el enlace]

Viendo 11 respuestas - de la 1 a la 11 (de un total de 11)
  • Hola @fotov60,

    Tu código me da una duda, ¿en qué momento compruebas el navegador y si el navegador permite webp? Entiendo que lo haces aquí, pero no veo que lo estés comprobando:

    // Define los formatos de imagen permitidos
    $image_formats = array( 'webp', 'jpeg', 'jpg', 'png', 'gif' );
    
    // Obtiene el tipo MIME de la imagen actual
    $mime_type = wp_check_filetype( $image_file )['type'];
    
    // Si el navegador admite el tipo MIME de la imagen actual, la muestra y sale del script
    if ( in_array( $mime_type, $image_formats ) ) {
        header( "Content-type: $mime_type" );
        readfile( $image_url );
        exit;
    }

    Lo que estás comprobando en ese IF es el tipo de la imagen contra un array que defines antes de formatos.

    La función wp_check_filetype https://developer.wordpress.org/reference/functions/wp_check_filetype/ define el tipo MIME del archivo que le pases, pero no de acuerdo al navegador, sino al propio tipo del archivo.

    Quizá tendrías que comprobar de alguna manera si el navegador del cliente soporta WEBP para luego hacer lo que necesitas.

    De todas formas, estuve viendo un plugin que lo trae solucionado, quizá sea bueno darle un vistazo WebP Express https://es.wordpress.org/plugins/webp-express/

    Saludos.

    Iniciador del debate fotov60

    (@fotov60)

    Hola @danidub gracias por tu respuesta. Tienes razon, el codigo no está bien planteado, ya que lo he hecho con ayuda de chatgpt y el resultado no es muy bueno.

    Durante este tiempo he seguido «peleandome» con el y me ha ofrecido varias alternativas, no se si quizas esta sea mas valida, aunque me devuelve una pantalla en blanco si la copio en functions.php.

    function serve_image_in_correct_format($filename) {
      // Obtener la extensión del archivo
      $extension = pathinfo($filename, PATHINFO_EXTENSION);
    
      // Verificar si el navegador es compatible con WebP
      $webp_supported = isset($_SERVER['HTTP_ACCEPT']) && strpos($_SERVER['HTTP_ACCEPT'], 'image/webp') !== false;
      
      // Si el navegador es compatible con WebP, intentar servir la imagen en formato WebP
      if ($webp_supported && $extension !== 'gif') {
        $webp_filename = substr($filename, 0, strrpos($filename, '.')) . '.webp';
        if (file_exists($webp_filename)) {
          $filename = $webp_filename;
        }
      }
    
      // Obtener el tipo de contenido del archivo
      $mime_type = mime_content_type($filename);
    
      // Enviar las cabeceras HTTP necesarias
      header('Content-Type: ' . $mime_type);
      header('Content-Length: ' . filesize($filename));
      header('Cache-Control: public, max-age=86400');
    
      // Mostrar la imagen
      readfile($filename);
      exit;
    }
    
    add_action('template_redirect', function() {
      // Obtener la ruta de la imagen solicitada
      $requested_image_path = $_SERVER['DOCUMENT_ROOT'] . $_SERVER['REQUEST_URI'];
    
      // Si la imagen existe, servirla en el formato correcto
      if (file_exists($requested_image_path)) {
        serve_image_in_correct_format($requested_image_path);
      }
    });
    

    Según dice:
    «Este código primero verifica si el navegador del usuario admite WebP utilizando la cabecera HTTP «Accept». Si el navegador es compatible con WebP, intenta servir la imagen solicitada en formato WebP. Si la imagen WebP no está disponible, se sirve en el formato original.

    Si el navegador no admite WebP o si la imagen solicitada es un GIF, se sirve la imagen en el formato original.»

    He mirado la opción del plugin que propones, pero me plantea dos dudas.

    La primera es que uso un servidor litespeed y por lo que leo en su descripcion «LiteSpeed Cache can be set up to maintain separate page caches for browsers that supports webp and browsers that don’t. Through this functionality it is possible to use «Alter HTML» with the option «Replace image URLs» and «Only do the replacements in webp enabled browsers» mode.» pero soy incapaz de encontrar esa opción en la configuración de LiteSpeed por lo que no se si funcionaria adecuadamente.

    La segunda es que en principio habia pensado en un codigo por no sobrecargar el WordPress de plugins y porque queria aplicarlo solo a las imagenes que conforman el tema.

    Os agradeceré cualquier ayuda. Saludos

    Hola @fotov60,

    Usar chatGPT para crear código y aplicarlo a tu web necesita conocimientos avanzados sobre programación. Por eso te está fallando lo que propones.

    Por otra parte un plugin bien hecho, no sobrecarga WordPress, seguramente te «facilite» lo que quieras hacer de una forma segura. Los plugins que encuentras en el repositorio pasan muchos controles. El código que te da chatGPT no pasa ningún filtro mas que el tuyo propio.

    Te recomiendo nuevamente utilizar un plugin para lo que quieres lograr. Si ves que te «carga» mucho la instalación, puedes probar con otro.

    Leyendo y traduciendo nuevamente la pregunta frecuente que citas del plugin que comentamos antes veo:

    You do not have to do anything special for it to work on a Litespeed server. You should be able to use WebP Express in any operation mode. For best performance, I however recommend that use the LiteSpeed Cache plugin for page caching.

    No tienes que hacer nada especial para que funcione en un servidor Litespeed. Lo único que recomiendan es usar el plugin LiteSpeed Cache.

    Por último, si quieres seguir con la vía de chatGPT o hacerlo sin plugin, te recomiendo que contactes con un desarrollador para lograr de forma segura lo que necesitas.

    Saludos.

    Iniciador del debate fotov60

    (@fotov60)

    Puede que tengas razón, pero lo estoy probando y no acabo de ver como configurarlo. De hecho si te fijas en el segundo parrafo te habla de generar dos paginas separadas en cache y un link a una pagina de github donde alguien explica como usar LiteSpeed Cache + BunnyCDN (que es tambien de pago).

    LiteSpeed Cache can be set up to maintain separate page caches for browsers that supports webp and browsers that don’t. Through this functionality it is possible to use «Alter HTML» with the option «Replace image URLs» and «Only do the replacements in webp enabled browsers» mode.

    The setup was kindly shared and explained in detail by @ribeiroeder here

    https://github.com/rosell-dk/webp-express/issues/433

    Quiere decir eso que para usarlo con Litespeed tengo que usarlo con ese CDN? Y Litespeed tiene una funcion de optimización de imagenes, no se generará incompatibilidades?

    Ahora que lo comentas y buscando un poco en la web, parece que lo que quieres lograr se podría simplemente con el plugin de LiteSpeed Cache desde las opciones (activando el reemplazo de imágenes WebP y luego realizando la optimización de las mismas desde el plugin).

    Mírate este hilo: https://www.litespeedtech.com/support/forum/threads/webp-images.16204/

    También tienes la guia de optimización de imágenes de LiteSpeed aquí: https://docs.litespeedtech.com/lscache/lscwp/imageopt/

    De todas formas entiendo que usando el plugin que comentamos inicialmente no necesitas hacer mucho más que activarlo, el texto que citas dice «LiteSpeed Cache can be set up to maintain separate» la palabra «can» esta dando significado de «que puede configurarse de la siguiente manera»… No significa que lo tengas que hacer, simplemente que puedes hacerlo.

    Seguramente existirán otros plugins que puedas buscar en el repositorio de WordPress, te dejo otro para que le eches un vistazo Imagify https://wordpress.org/plugins/imagify/

    Sobre tu última consulta sobre «si se generaran incompatibilidades», la puedes resolver probando. Cada conjunto de web, componentes y servidor es un mundo distinto, lo que puede funcionarte a ti puede que no me funcione a mí, solo lo sabrás si lo pruebas.

    Yo creo que con toda esta info ya lo vas a poder solucionar. Si lo haces por favor marca el ticket como resuelto 💪

    hola @fotov60 ,

    webpexpress es un plugin muy sencillo y que da muy buena respuesta.

    Espero haber ayudado, Saludos

    Iniciador del debate fotov60

    (@fotov60)

    He conseguido solucionarlo añadiendo estas lineas al .htaccess:

    <IfModule LiteSpeed>
    RewriteCond %{HTTP_ACCEPT} “image/webp” 
    RewriteCond %{REQUEST_FILENAME}.webp -f 
    RewriteRule ^(.*).(jpg|jpeg|png|gif) $1.$2.webp [T=image/webp,L]
    </IfModule>

    Y despues convirtiendo las imagenes de la carpeta donde estan las imagenes que tenian el problema y renombrandolas con el mismo nombre pero terminadas en *.jpg.webp . Segun Insights el problema ha desaparecido porque ya no aparece el aviso, pero yo no consigo verlo a traves de inspeccionar de Chrome ya que las imagenes se cargan a traves de un javascript y no veo las imagenes con el nombre modificado. Si alguien puede comprobarlo por mi se lo agradeceria.

    Hola @fotov60,

    Me alegro que hayas conseguido lo que quieres.

    De todas maneras, los problemas que estás comentando son problemas muy específicos sobre tu instalación de WordPress. Te recomiendo que contactes con un profesional, los foros no pueden sustituir a la ayuda profesional y están pensando para dar soporte a problemas genéricos o usuarios principiantes, pero no podemos sustituir al trabajo que hacen los profesionales independientes o las agencias de desarrollo.

    Saludos.

    Iniciador del debate fotov60

    (@fotov60)

    Al contrario, creo que mas gente podrá beneficiarse de este problema, ya que por lo visto el origen era que el tema que uso carga las imagenes via javascript lo que hace que el metodo de sustitución de Litespeed no funcionase.

    Imagino que habrá mas gente que como yo usará algun tema cuyo desarrollador habrá usado el mismo metodo para cargar las imagenes creando el mismo problema al usuario.

    Hasta que he conseguido descubrir donde estaba el problema y como solucionarlo me ha llevado bastante trabajo, por lo que si a alguien puede ahorrarselo ya sea porque no caiga en la posible causa o la posible solución, bienvenido sea, no?

    Moderador almendron

    (@almendron)

    Coincido con @algato333

    Es mucho más sencillo usar https://es.wordpress.org/plugins/webp-express/

    Iniciador del debate fotov60

    (@fotov60)

    Salvo si tu servidor usa Litespeed, lo que le da mas sentido a intentar aprovechar los recursos que ya tienes y no duplicar plugins que hagan lo mismo.

    Ademas WebP Express tiene una pequeña pega, no convierte archivos gif.

Viendo 11 respuestas - de la 1 a la 11 (de un total de 11)
  • El debate ‘Mostrar imagenes del tema segun el navegador’ está cerrado a nuevas respuestas.