Проверка, установлен ли $FILE для массива метабоксов загрузки файлов
Я боролся с этим почти 2 дня безрезультатно. У меня есть пользовательский тип записи PRODUCTS
, в котором есть группа метабоксов для загрузки PDF-файлов в wp-admin
. Я создал метабоксы в администраторе. Вот код для моих метабоксов:
//PDF upload Meta Boxes
$meta_box_pdf_uploads = array(
'id' => 'products-pdf-meta-boxes',
'title' => "PDFs",
'page' => 'product', //attach to products custom post
'context' => 'normal',
'priority' => 'default',
'fields' => array(
array(
'name' => $prefix . 'pdf1',
'desc' => 'Product PDF',
'id' => $prefix . 'pdf1',
'type' => 'text'
),
array(
'name' => $prefix . 'pdf2',
'desc' => 'Product PDF',
'id' => $prefix . 'pdf2',
'type' => 'text'
)
)
);
На данный момент нужно загрузить только два PDF-файла. Вот код для отображения моих метабоксов в меню администратора:
function products_pdf_uploads_show_meta() {
global $meta_box_pdf_uploads, $post, $prefix;
echo '<table class="form-table">';
echo '<p class="description">Upload your PDFs here</p>';
foreach ($meta_box_pdf_uploads['fields'] as $field) {
// get current post meta data
$meta = get_post_meta($post->ID, $field['id'], true);
echo '<tr>',
'<td>',
'<input type="file" style="width: 700px;" name="', $field['id'], '" id="', $field['id'], '" />',
'</td>',
'</tr>';
}
echo '</table>';
}
Все это работает до тех пор, пока я не попытаюсь проверить, имеет ли значение поле загрузки файла или нет. Вот с чем я сейчас работаю в том, что касается кода для сохранения мета-кода (есть тонны кода отладки, чтобы вы знали):
//Upload PDF files
foreach ($meta_box_pdf_uploads['fields'] as $pdf_field) {
//Make sure field isn't emtpy
if(isset($_FILES[$pdf_field['name']]) {
//var_dump($_FILES);
print_r ($_FILES[$pdf_field['name']]); //debugging
$pdf_type = $_FILES[$pdf_field['name']['tmp_name']]; //debugging, can't get this to return any value
wp_die('Passed! '. $pdf_type); //debugging
//Setup File type allowed
//Get the file type
} else {
//var_dump($_FILES);
print_r ($_FILES[$pdf_field['name']]);
wp_die('Nothing was passed: ' . $pdf_field['name']); //debugging
}
}
Теперь, даже если я не добавлю файл в поле загрузки, мое первое условие все равно будет выполнено здесь:
if(isset($_FILES[$pdf_field['name']]) {
Я знаю, что это потому, что он возвращает массив поля $pdf_. Я также попытался проверить, была ли ошибка 0, используя $_FILES[$pdf_field['name']['error']
, но я не могу вернуть ни одно из значений массива $_FILE.
Когда указываете поле для загрузки, и я делаю print_r ($_FILES[$pdf_field['name']])
это возвращает:
Array ( [name] => 1testpdf.pdf [type] => application/pdf [tmp_name] => /tmp/phpF7HQnJ [error] => 0 [size] => 8278 )
Это правильно, но это также происходит, когда я не указываю поле, только все значения массивов пусты, за исключением ОШИБКИ, равной 4 (файл не указан).
Я рвал на себе волосы из-за этого. Каков наилучший способ сделать это? Я думаю, что если бы это был один метабокс, и я мог бы назвать его так, как $FILE['name_of_file']['error']
, это сработало бы. Почему использование foreach
все портит?
Спасибо вам!
1 answers
Ах, я думаю, что смог ответить на этот вопрос самостоятельно. Я создал переменную для массива $_FILES($pdf_field['имя']) и смог использовать ее для получения значений массива. Просто нужно немного обработать ошибки и проверить мои загрузки. Если что-то не так с этим обращением, пожалуйста, дайте мне знать.
//Upload PDF files
foreach ($meta_box_pdf_uploads['fields'] as $pdf_field) {
//put file array into a variable
$pdf = $_FILES[$pdf_field['name']];
//if array is set and there is no error
if(isset($pdf['error']) && $pdf['error'] > 0) {
//setup error handling based on error code
wp_die('Error uploading file: Error Number is ' . $pdf['error']);
} else { //Passed