Использование file_exists для проверки файла в папке Uploads
Контекст: Для изображений сайта, используемых в определенном разделе, каждый пост опирается на базовое имя, помещенное в метаданные, которое затем используется с автоматическими расширениями для создания больших изображений, миниатюр галереи и миниатюры для индексной страницы.
Например, если Example_Name является базовым именем, тогда:
Example_Name_2-LG.jpg
- это второе большое изображение в серии
Example_Name_2_SM.jpg
- это соответствующая вторая миниатюра галереи
Example_Name_IN.jpg
- это индексная миниатюра, выбранная для представления набора
Используя метаданные и условные операторы PHP, клиенту нужно только один раз ввести базовое имя и загрузить правильно названные изображения в папку Uploads, а шаблон страницы заполнит остальное.
Всё это работает хорошо, с одним исключением. Есть семь слотов для миниатюр, и страница отображает все div-ы миниатюр, даже если в папке Uploads меньше семи изображений миниатюр.
Я хотел бы обернуть каждый div миниатюры условием, которое использует file_exists
для проверки существования миниатюр, фактически находящихся в папке Uploads, чтобы если названного изображения не существует по указанному пути, соответствующий пустой div (и его гиперссылка) не появлялись.
Я пробовал создавать абсолютные пути, используя функцию wp_uploads_dir
, а также bloginfo('template_directory')
и даже устаревший TEMPLATEPATH
, но добился только PHP ошибок. Я предполагаю, что это проблема с путём или что-то особенное, чего я не понимаю о PHP функции file_exists
.
Пример кода, вызывающий ошибку, с использованием 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"> <!-- Должен появляться только когда Example_Name_7_SM.jpg существует -->
...
</div>
<?php } ?>
Буду благодарен за любые предложения.

Нельзя использовать URL файла в функции file_exists()
таким образом:
file_exists( "http://example.com/wp-content/uploads/Example_Name_2_SM.jpg" );
Вместо этого следует использовать абсолютный путь к файлу, например:
file_exists( "/absolute/path/to/wp-content/uploads/Example_Name_2_SM.jpg" );
Затем можно попробовать такой вариант:
$meta = get_post_meta( $post->ID, '_meta_example_name', true );
$file = $upload_basedir . '/' . $meta . '_7_SM.jpg';
if ( file_exists( $file ) ) {
//...
}
где
$upload_basedir = WP_CONTENT_DIR . '/uploads';
или
$upload_dir = wp_upload_dir();
$upload_basedir = $upload_dir['basedir'];

В этой строке...
if ( file_exists( echo $upload_dir['baseurl'] . '/' . echo get_post_meta($post->ID, '_meta_example_name', true) . '_7_SM.jpg')` )
... вам не нужны все эти echo
. Вы не пытаетесь ничего выводить. У вас даже echo
перемешаны с конкатенацией строк. Уберите их все.
if (
file_exists( $upload_dir['baseurl'].'/'.get_post_meta($post->ID,'_meta_example_name',true).'_7_SM.jpg')
)
Я бы, вероятно, проверил метаданные записи заранее и пропустил вызов file_exists
, если мета-ключ пуст.
$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')
) {
// ваш HTML-код
}

Если вам нужно проверить файл в теме, вы можете использовать мою функцию
function file_checker($file){
//http://localhost/wordpress/wp-content/themes/ИМЯТемы
$location = get_template_directory_uri();// вы можете изменить это <=
$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));
}
использование
if(file_checker("/style.css")){
echo "Файл существует";
}else{
echo "Ошибка расположения, проверьте ваш код";
}
