Usar file_exists para verificar archivos en Uploads

2 jun 2013, 02:08:32
Vistas: 32.7K
Votos: 3

Contexto: Para las imágenes de un sitio usadas en una sección particular, cada entrada depende de un nombre base guardado en metadatos, que luego se usa con extensiones automáticas para generar imágenes grandes, miniaturas de galería y una miniatura de página de índice.

Por ejemplo, si Example_Name es el nombre base, entonces:
Example_Name_2-LG.jpg es la segunda imagen grande en la serie
Example_Name_2_SM.jpg es la correspondiente segunda miniatura de galería
Example_Name_IN.jpg es la miniatura de índice elegida para representar el conjunto

Usando metadatos y condicionales PHP, el cliente solo tiene que ingresar el nombre base una vez y subir las imágenes con los nombres apropiados a la carpeta Uploads, y la plantilla de página completa los espacios en blanco.

Todo esto funciona bien, con un detalle. Hay siete espacios para las miniaturas, y la página muestra todos los divs de miniaturas, incluso si hay menos de siete imágenes en miniatura en la carpeta Uploads.

Me gustaría envolver cada div de miniatura con un condicional que use file_exists para verificar la existencia de imágenes en miniatura realmente en la carpeta Uploads, de modo que si la imagen nombrada no existe en la ruta de archivo indicada, el div vacío correspondiente (y su hipervínculo) no aparezca.

He intentado construir rutas absolutas usando la función wp_uploads_dir, así como bloginfo('template_directory') e incluso el obsoleto TEMPLATEPATH, pero solo he logrado generar errores PHP. Asumo que esto es un problema de ruta o algo particular que no entiendo sobre la función PHP file_exists.

Ejemplo de error en la página usando wp_upload_dir:

<?php 
    $upload_dir = wp_upload_dir(); 
    if ( file_exists( echo $upload_dir['baseurl'] . '/' . echo get_post_meta($post->ID, '_meta_example_name', true) . '_7_SM.jpg') ) {
?>
    <div id="thumb7" class="thumb">  <!-- Debería aparecer solo cuando Example_Name_7_SM.jpg existe -->
        ...
    </div>

<?php } ?>

Cualquier sugerencia es apreciada.

1
Comentarios

Antes que nada, ¿has revisado la documentación de PHP para esta función? Al igual que el Codex, es una referencia esencial.

brasofilo brasofilo
2 jun 2013 03:13:20
Todas las respuestas a la pregunta 4
0

No puedes usar una URL de archivo en file_exists() de esta manera:

file_exists( "http://example.com/wp-content/uploads/Example_Name_2_SM.jpg" );

Deberías usar mejor una ruta absoluta de archivo, por ejemplo:

file_exists( "/ruta/absoluta/hacia/wp-content/uploads/Example_Name_2_SM.jpg" );

Entonces deberías probar

$meta = get_post_meta( $post->ID, '_meta_ejemplo_nombre', true );
$file = $upload_basedir . '/' . $meta . '_7_SM.jpg';
if ( file_exists( $file ) ) {
   //...
}

donde

$upload_basedir = WP_CONTENT_DIR . '/uploads';

o

$upload_dir = wp_upload_dir();
$upload_basedir = $upload_dir['basedir'];
2 jun 2013 08:13:00
0

En esta línea...

if ( file_exists( echo $upload_dir['baseurl'] . '/' . echo get_post_meta($post->ID, '_meta_example_name', true) . '_7_SM.jpg')` )

... no quieres todos esos echo. No estás intentando hacer echo de nada. Incluso tienes echo intercalados con concatenación de cadenas. Omite todos esos.

if ( 
  file_exists( $upload_dir['baseurl'].'/'.get_post_meta($post->ID,'_meta_example_name',true).'_7_SM.jpg') 
)

Probablemente comprobaría el meta del post antes y saltaría la llamada a file_exists si la clave meta está vacía.

$upload_dir = wp_upload_dir();
$meta_name = get_post_meta($post->ID,'_meta_example_name',true);
if (
  !empty($meta_name)
  && file_exists( $upload_dir['baseurl'].'/'.$meta_name.'_7_SM.jpg') 
) {
  // tu marcado
}
2 jun 2013 07:56:24
0

Deberías usar __DIR__. Asumiendo que estás verificando dentro del archivo functions.php, sería:

if(file_exists(__DIR__ . '/../../uploads/Example_Name_2_SM.jpg')){
    // Hacer algo ...
}
22 mar 2019 19:59:00
0

Si necesitas para tu tema puedes usar mi función

function file_checker($file){
    //http://localhost/wordpress/wp-content/themes/NOMBREdelTEMA
    $location = get_template_directory_uri();// puedes editar esto <=
    $location = str_replace("http://","",$location);
    $location = str_replace("https://","",$location);
    $location = str_replace($_SERVER['HTTP_HOST'],"",$location);
    $location = $_SERVER['DOCUMENT_ROOT'].$location;
    $filename = $location.$file;
    return (file_exists($filename));

}

uso

if(file_checker("/style.css")){
    echo "El archivo existe";
}else{
    echo "Error de ubicación, revisa tu código";
}
9 jul 2020 17:46:31