Не могу использовать функцию php fopen() в wordpress functions.php

Я пытаюсь просто запустить fopen() в файле functions.php, а также попробовал его в файле шаблона wordpress test.php.

Но это не работает. Если я перемещу файл test.php и файл csv в место за пределами папки темы, это сработает в первый раз.

function csv_to_array($filename='', $delimiter=',')
{
    if(!file_exists($filename) || !is_readable($filename))
        return FALSE;

    $header = NULL;
    $data = array();
    if (($handle = fopen($filename, 'r')) !== FALSE)
    {
        while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
        {
            if(!$header)
                $header = $row;
            else
                $data[] = array_combine($header, $row);
        }
        fclose($handle);
    }
    return $data;
}

echo '<pre>';
var_dump(csv_to_array('csv/nationality-codes.csv'));
echo '</pre>';

Это моя структура папок в файле темы...

введите здесь описание изображения

Любые идеи, почему это не работает?


person Joshc    schedule 24.02.2014    source источник
comment
fopen выдаст предупреждение, если не сможет открыть файл. Включите отчеты об ошибках и/или проверьте журнал ошибок.   -  person deceze♦    schedule 24.02.2014
comment
Он открывает файл нормально. Только не когда в папке темы. Нет ошибок   -  person Joshc    schedule 24.02.2014
comment
Дайте несколько сообщений об ошибках между ними и проверьте, где это не удается.   -  person Abhishek Saha    schedule 24.02.2014
comment
@Joshc включает отладку, и она покажет вам проблему с путем   -  person Volatil3    schedule 24.02.2014
comment
переименуйте print_r в var_dump и проверьте, что возвращает ваша функция. Вы также можете попробовать включить отчет об ошибках перед вызовом функции.   -  person Skriptotajs    schedule 24.02.2014
comment
отладка включена, ошибок нет. Var dump возвращает boo false — одинаковый код в обоих файлах. Файл, не относящийся к теме: samlowes.com/test . Файл шаблона темы: samlowes.com/core/test   -  person Joshc    schedule 24.02.2014
comment
В дополнение к приведенным выше комментариям, поскольку загрузка файла и работа с данными, содержащимися в нем, во многом похожа на функциональность, а не на эстетику/тематику, вам следует подумать о создании собственного функционального плагина.   -  person versvs    schedule 24.02.2014
comment
ОК разрешено. Но почему это не работает? Это сводит меня с ума. Он должен просто открыть csv так же, как и вне папки темы.   -  person Joshc    schedule 24.02.2014
comment
Замените путь к файлу полной версией. var_dump( csv_to_array( get_template_directory() . '/csv/nationality-codes.csv' ) );   -  person Nathan Dawson    schedule 24.02.2014
comment
@NathanDawson samlowes.com/core/wp-content/ темы/samlowes/csv/   -  person Joshc    schedule 24.02.2014
comment
@Joshc Пожалуйста, проверьте мой комментарий выше. Кстати, это должен быть путь к файлу, а не URL. get_template_directory вернет нужный вам путь.   -  person Nathan Dawson    schedule 24.02.2014
comment
@nathanDawson ДА, чувак, ты легенда!!! Большое спасибо за помощь. Возможно, вы захотите сделать из этого ответ. Спасибо   -  person Joshc    schedule 24.02.2014
comment
Рад, что смог помочь. Сейчас я превращу это в ответ :)   -  person Nathan Dawson    schedule 24.02.2014


Ответы (2)


Вам нужно использовать полный путь к файлу вместо относительного.

Используйте функцию WordPress get_template_directory(), чтобы получить путь к каталогу вашего шаблона. Оттуда добавьте путь к вашему файлу.

Изменять:

var_dump(csv_to_array('csv/nationality-codes.csv'));

To:

var_dump( csv_to_array( get_template_directory() . 'csv/nationality-codes.csv' ) );
person Nathan Dawson    schedule 24.02.2014

Наконец-то мой код заработал с помощью NathanDawnson.

По какой-то причине functions.php не понравился относительный путь. Это было исправление...

get_template_directory() . '/csv/nationality-codes.csv'

См. полный рабочий код.

// csv to array
function csv_to_array($filename='', $delimiter=',')
{
    if(!file_exists($filename) || !is_readable($filename))
        return FALSE;

    $header = NULL;
    $data = array();
    if (($handle = fopen($filename, 'r')) !== FALSE)
    {
        while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
        {
            if(!$header)
                $header = $row;
            else
                $data[] = array_combine($header, $row);
        }
        fclose($handle);
    }
    return $data;
}


// rider nationality
function motocom_rider_nationality( $field )
{

    // reset choices
    $field['choices'] = array();

    // get the textarea value from options page without any formatting
    $choices = csv_to_array( get_template_directory() . '/csv/nationality-codes.csv' );

    $field['choices'] = array(
        null => 'Select nationality...'
    ); 

    // loop through array and add to field 'choices'
    if( is_array($choices) )
    {

        foreach( $choices as $choice )
        {

            $label = $choice['Country'];
            $value = $choice['A3'];

            $field['choices'][ $value ] = $label . ' [' . $value . ']';

        }
    }

    // Important: return the field
    return $field;

}
add_filter('acf/load_field/name=rider_nationality', 'motocom_rider_nationality');
person Joshc    schedule 24.02.2014