【问题标题】:PHP Function "opendir()" in Wordpress. Works in one file, but not in otherWordpress 中的 PHP 函数“opendir()”。适用于一个文件,但不适用于其他文件
【发布时间】: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


【解决方案1】:

您的相对路径很可能不是正确的——通常发生在脚本从两个不同物理位置运行时。

在调用opendir 之前直接生成getcwd() 的调试输出将显示脚本在这两种情况下实际运行的目录——该位置是用于“完成”相对路径的位置,所以如果那些不匹配是很自然的,其中一个会失败。

这样,相对路径总是很棘手。通常最好使用相对于服务器根目录的路径(以/ 开头)以避免此类问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    相关资源
    最近更新 更多