Я создаю плагин для WordPress, который требует наличия двух файлов для нормальной работы.
Первый файл определяется как путь к файловой системе, а второй – как URL.
Предположим, что первый файл:
/home/my_site/public_html/some_folder/required_file.php
и второй файл:
http://www.my_site.com/some_folder/required_url_file.php
Обратите внимание, что оба файла не являются одним и тем же файлом в файловой системе. У файла required_file.php есть другой контент, чем required_url_file.php, и они действуют абсолютно по-разному
Любая идея о том, как проверить существование обоих файлов?
Вы можете проверить оба варианта:
$file = '/home/my_site/public_html/some_folder/required_file.php'; $url = 'http://www.my_site.com/some_folder/required_url_file.php'; $fileExists = is_file($file); $urlExists = is_200($url); $bothExists = $fileExists && $urlExists; function is_200($url) { $options['http'] = array( 'method' => "HEAD", 'ignore_errors' => 1, 'max_redirects' => 0 ); $body = file_get_contents($url, NULL, stream_context_create($options)); sscanf($http_response_header[0], 'HTTP/%*d.%*d %d', $code); return $code === 200; }
Основанный на примере кода Maor H., вот функция, которую я использую в своих плагинах:
/** * Check if an item exists out there in the "ether". * * @param string $url - preferably a fully qualified URL * @return boolean - true if it is out there somewhere */ function webItemExists($url) { if (($url == '') || ($url == null)) { return false; } $response = wp_remote_head( $url, array( 'timeout' => 5 ) ); $accepted_status_codes = array( 200, 301, 302 ); if ( ! is_wp_error( $response ) && in_array( wp_remote_retrieve_response_code( $response ), $accepted_status_codes ) ) { return true; } return false; }
Я сделал этот метод в классе-помощнике, однако, поместив его в файл functions.php вашей темы, вы должны сделать его общедоступным везде. Однако вы всегда должны писать в классах и создавать их. Это намного лучше для изоляции ваших функций плагина и темы.
При этом вы можете просто использовать:
if (webItemExists ('http://img.ruphp.com/wordpress/f)) {print' it iexists '; }
Чаще всего вы будете использовать вызовы WordPress для доступа ко всем элементам через относительный или полный URL. Если у вас есть относительная ссылка на что-то вроде /uploads/2012/12/myimage.png, вы можете преобразовать их в URL с полным URL-адресом и относительным URL-адресом WordPress, просто добавив get_site_url (). $ string при вызове функции webItemExists.
Что касается проверки URL-адреса, ни один из этих ответов не рассматривает правильный способ WordPress для выполнения этой задачи.
Для этой задачи следует использовать wp_remote_head()
.
Вот статья, которую я написал о том, как проверить, существует ли внешний URL-адрес с HTTP API-интерфейсом WordPress . Проверьте это и выясните, как это работает.
$file_exists = file_exists($path); $url_accessable = http_get($url, array("timeout"=>10), $info); // should not be FALSE $status_code = $info['response_code'] //should be 200
Если у вас есть функция PECL http_head
, вы можете проверить, возвращает ли он код состояния 200 для удаленного файла.
Чтобы проверить, можете ли вы получить доступ к локальному файлу, можете использовать file_exists
, но это не означает, что вы сможете получить доступ к этому файлу. Чтобы проверить, можете ли вы прочитать этот файл, используйте is_readable
.
Использовать функцию file_exists ()
file_exists('http://www.my_site.com/some_folder/required_url_file.php');
вы получите результаты как True или false.
Чтобы проверить, существует ли файл, используйте метод file_exists .
Начиная с PHP 5.0.0, эта функция также может использоваться с некоторыми обертками URL. Обратитесь к поддерживаемым протоколам и упаковщикам, чтобы определить, какие обертки поддерживают семейство функций stat ().
if(! (file_exists($url1) && file_exists($url2)) ) { die("Files don't exist - throw error here."); } // Continue as usual - files exist at this point.
дистанционный пульт:
$file = 'http://www.my_site.com/some_folder/required_url_file.php' if ( @fclose(@fopen($file,"r")) ) echo "File exists!";
местный:
$file = '/home/my_site/public_html/some_folder/required_file.php'; if ( is_file($file) ) echo "File exists!";
Кажется, это работает для меня:
function url_file_exists($url) { $context = stream_context_create(array('http' =>array('method'=>'HEAD'))); $fd = @fopen($url, 'rb', false, $context); if ($fd!==false) { fclose($fd); return true; } return false; }
Проверка наличия файла:
if (file_exists('path/to/file.txt')) { echo "File exists!"; } else { echo "File doesn't exist."; }
Проверка правильности URL:
$data = @file_get_contents("http://url.com/"); if (!$data) { echo "URL not valid."; } else { echo "URL is valid."; }
Заметки:
В идеале вы не должны пытаться предсказать файловую систему. Хотя методы, такие как file_exists, очень полезны, на них не следует полагаться, и вместо этого вы должны пытаться писать в файлы, читать их и т. Д., А затем улавливать и обрабатывать любые исключения или ошибки, которые происходят.