【发布时间】:2014-05-14 00:37:47
【问题描述】:
好的,这需要很长的解释。太长了见谅:
/////////////////////////////////简介////////////
似乎没有太多关于在 Wordpress 中使用 opendir() 及其实现方式的信息。然而,经过几个小时的研究、反复试验,我得到了它在自定义页面模板上的工作。
我需要它从文件夹中获取游戏缩略图并将它们输出为网格,按类别划分(每个文件夹都是一个类别)。
/////////////我的方法/////////////
我在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 变量中并将其发送到抓取它并将其传递给 fetch_game_images(); 函数的 php。
我的 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。
///////////// 问题/////////////
有人知道这种行为背后的原因是什么吗?我阅读了大部分关于这个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 问题。
【问题讨论】:
-
您的相对路径很可能不是正确的——通常发生在脚本从两个不同的物理位置运行时。使用相对于服务器根目录的路径。
-
如果你不相信你的路径有问题 - 即使 PHP 明确告诉你 - 然后在调用之前直接制作
getcwd()的调试输出opendir,并告诉我们在这两种情况下会产生什么结果。 -
对不起。我注意到我的 “我的路径是正确的” 语句中隐含的傲慢(我编辑了它)。我正在尝试你的建议。谢谢! :)
-
别担心,这是初学者的常见错误 :-) 随着时间的推移,您会发现 PHP 通常是正确的。那么,问题已解决,还是您需要进一步的帮助?
-
成功了!谢谢你。我将编辑我的问题以显示正确的方法。我希望你能把你的评论作为答案,这样我就可以投票给你一些分数:)
标签: php jquery wordpress get opendir