Функция PHP "opendir()" в Wordpress. Работает в одном файле, а не в другом
Хорошо, это потребует длинного объяснения. Извините, если это слишком долго:
/////////////// ВСТУПЛЕНИЕ ///////////////
Там, кажется, не так много информации об использовании opendir()
в Wordpress и как это должно быть реализовано. Однако, после нескольких часов исследований, проб и ошибок, я начал работать над пользовательским шаблоном страницы.
Мне нужно, чтобы получить миниатюрные изображения игр из папок и вывести их в виде сетки, разделенной на категории (каждая папка является категорией).
/////////////// МОЙ ПОДХОД ///////////////
Я создал функцию в functions.php
который открывает и читает папку, используя следующий относительный путь:
"wp-content/games/".$category."/"
куда $category
это аргумент функции (определяется пользователем).
Вот как теперь выглядит моя функция:
function fetch_game_images($category){
//$category = 'featured';
$imageFiles = array();
$extensions = array('.JPG','.PNG');
$directory = "wp-content/games/".$category."/";
$openDir = opendir($directory);
while ($imgFile = readdir($openDir))
{
if ($imgFile <> '.' and $imgFile <> '..')
{
$extension = strtoupper(substr($imgFile, strrpos($imgFile, '.')));
if (in_array($extension, $extensions))
{
$imageFiles[] = $imgFile;
}
}
}
closedir($openDir);
foreach ($imageFiles as $k => $v)
{
$withoutExt = preg_replace("/\\.[^.\\s]{3,4}$/", "", $v);
$hyphenlessName = str_replace("-"," ",$withoutExt);
$formattedName = strlen($hyphenlessName) > 24 ? substr($hyphenlessName,0,24)."..." : $hyphenlessName;
if ($category == 'featured'){
if (strpos($formattedName,'netent') !== false) {$finalName = trim($formattedName, 'netent');}
else if (strpos($formattedName,'mg') !== false) {$finalName = trim($formattedName, 'mg');}
else { $finalName = $formattedName;}
}
else { $finalName = $formattedName;}
echo '<div class="games-list-item"><div class="game-container">';
echo '<a href=""><img src="'.get_bloginfo('url').'/'.$directory.'/'.$v.'" alt=""/>';
echo '<h3>'.$finalName.'</h3></a>';
echo '<div class="game-hover">';
echo '<img src="'.get_bloginfo('url').'/'.$directory.'/'.$v.'" alt=""/>';
echo '<div class="game-buttons-holder"><a class="play_now_btns" href="">Play Now</a><a class="free_play_btns" href="">Free Play</a></div></div><!--.game-hover-->';
echo '</div><!--.game-container--></div><!--.games-list-item-->';
}
}
/////////////// РЕЗУЛЬТАТЫ МОЕГО ПОДХОДА /////////////////
Когда я загружаю страницу Wordpress, используя шаблон страницы, который вызывает эту функцию, она загружает изображения безупречно.
Но затем мне нужно динамически изменить категорию игр с помощью jQuery, я беру имя категории / папки, сохраняю его в переменной JavaScript и отправляю в php, который берет его и передает его fetch_game_images();
функция.
Мой jQuery GET
выглядит так:
$('#sidebar-list-menu li a').live('click', function(){
event.preventDefault();
var category = $(this).data('category');
//alert(cat);
//$('div.games-grid').html('<span class="loadingNotification">LOADING</span>');
$.get("<?php bloginfo('template_directory'); ?>/games-list-loader.php?category="+category,
function(data){
//alert(data);
//$('span.loadingNotification').remove();
$('div.games-grid').html(data);
});
});
И файл PHP (расположенный в том же каталоге темы) выглядит так:
<?php $parse_uri = explode( 'wp-content', $_SERVER['SCRIPT_FILENAME'] );
require_once( $parse_uri[0] . 'wp-load.php' );
$cat = $_REQUEST['category'];
fetch_game_images($cat);
?>
<div class="clear"></div>
/////////////// ПРОБЛЕМА ///////////////
Проблема в том, что когда я нажимаю на ссылку боковой панели, которая вызывает GET
вызов и пытается получить данные из PHP, он выводит следующую ошибку:
Warning: opendir(wp-content/games/featured/) [function.opendir]: failed to open dir: No such file or directory in [...]
Что не должно происходить вообще, так как и мой шаблон страницы, и мой пользовательский файл PHP находятся в одном каталоге и загружают ядро Wordpress для использования functions.php
,
/////////////// ВОПРОС ///////////////
Кто-нибудь знает, что может быть причиной такого поведения? Я прочитал большинство результатов Google, которые я мог найти об этом opendir()
ошибка, но большинство из них, кажется, указывают на неправильный путь, но мой кажется правильным.
Другие говорят, что это может быть проблема с разрешениями. Но мои папки были установлены на 755, а файлы на 644.
Так что любая помощь будет отличной! Спасибо.
<======== /////////// РЕДАКТИРОВАТЬ ///////// =========>
Благодаря помощи @CBroe я понял это:
Вместо использования свободного пути, как
"wp-content/games/".$category."/"
Я изменил его на серверный
ABSPATH . "/wp-content/games/".$category."/"
А потом я просто изменил вывод, чтобы соответствовать изменениям:
echo '<img src="'.get_bloginfo('url').'/wp-content/games/'.$category.'/'.$v.'" alt=""/>';
Это работает из обоих мест и решил GET
вопрос.
1 ответ
Скорее всего, ваш относительный путь неверен - обычно это происходит, когда скрипты запускаются из двух разных физических мест.
Создание отладочного вывода getcwd()
прямо перед звонком opendir
покажет вам, в каком каталоге фактически выполняются сценарии в обоих случаях - и это местоположение используется для "завершения" относительного пути, поэтому, если они не совпадают, то вполне естественно, что один из них потерпит неудачу.
Относительные пути всегда сложны. Обычно предпочтительнее использовать путь относительно корня сервера (начиная с /
) чтобы избежать таких проблем.