✅ Новости WEB и WordPress, темы, плагины. Здесь мы делимся советами и лучшими решениями для веб-сайтов.

Пересмотренная загрузка файлов в WordPress, часть 2 — серверная сторона

29

Прежде чем перейти непосредственно к коду для этого, я хотел бы упомянуть две вещи:

  1. Да, я подробно рассказывал об этом некоторое время назад,
  2. И это вторая часть цикла из двух частей.

Если вы не читали первую часть, сделайте это первой. Идея состоит в том, что код будет работать в сочетании с тем, что я собираюсь рассказать в этом посте, чтобы убедиться, что охвачены как клиентская, так и серверная стороны.

В конечном счете, причина такой разбивки заключается не только в том, чтобы убедиться, что все сделано правильно, но и в том, чтобы убедиться, что пользователь получает максимально положительный опыт.

С учетом сказанного, вот как можно загружать файлы в WordPress на стороне сервера.

Загрузка файлов в WordPress на стороне сервера

Обратите внимание, что даже несмотря на то, что есть некоторые проверки безопасности, которые могут и должны быть выполнены, мне еще предстоит найти способ, который полностью надежен при обнаружении того, что загружаемый файл имеет надлежащий тип.

Это означает, что все еще существует вероятность того, что файл неправильного типа может быть загружен. Является ли это вредоносным или нет, очевидно, зависит от конечного пользователя. Я делюсь этим только для того, чтобы прояснить, что код, который я собираюсь показать, настолько хорош, насколько я могу его предоставить, но что вы все равно должны использовать определенный уровень свободы действий.

Возможно, стоит даже поискать стороннюю библиотеку для проверки двоичных данных после их получения. Но я отвлекся.

1 Проверка разрешений пользователя

Помните, что всякий раз, когда мы создавали внешний интерфейс, WordPress генерировал одноразовый номер, чтобы мы могли использовать его, чтобы убедиться, что у пользователя есть разрешение на загрузку файла.

В дополнение к проверке одноразового номера, есть несколько других вещей, которые я люблю проверять, и все они включены в метод, называемый userCanSave.

Во- первых, вспомним интерфейс:

<form method="post"
      enctype="multipart/form-data"
      action="<?php echo esc_html(admin_url('admin-post.php')); ?>"">
    <!-- Snip For Brevity --->
    <?php
    wp_nonce_field(
        'acme-item-upload',
        'acme-item-importer'
    );
    ?>
</form>

Тогда посмотрите, как я использую это в коде. Сначала я определяю функцию userCanSave :

<?php

/**
 * Determines if the current user has permission to upload a file based on their current role and the values
 * of the security nonce.
 *
 * @param  string $nonce     The WordPress-generated nonce.
 * @param  string $action    The developer-generated action name.
 * @return bool              True if the user has permission to save; otherwise, false.
 */
private function userCanSave($nonce, $action)
{
    $isNonceSet   = isset($_POST[$nonce]);
    $isValidNonce = false;

    if ($isNonceSet) {
        $isValidNonce = wp_verify_nonce($_POST[$nonce], $action);
    }

    return ($isNonceSet && $isValidNonce);
}

И тогда я просто вызываю это в начале процесса. Если не получится, то верну.

<?php

/**
 * Assuming the user has permission, verifies the security nonce and uploads the PDF file to the `uploads`
 * directory and the Media Library.
 */
public function save()
{
  if (!$this->userCanSave('acme-item-importer', 'acme-item-upload')) {
    return;
  }

  // More to come...

}

Я рекомендую показать сообщение об ошибке, но я отвлекся от этого момента, так как в посте есть несколько способов сделать это.

2 Загрузите файл

Предполагая, что у пользователя есть разрешение на проверку файла, загрузка файла безопасна. Процесс для этого прост, но все же требует небольшой работы с WordPress API (а именно с функцией wp_upload_bits ).

Во-первых, файл нужно взять из глобальной папки PHP $_FILES, а затем загрузить. Однако при этом важно убедиться, что вы загружаете файл с правильным расширением файла (как минимум).

<?php

$file_type = explode('.', $filename);
$file_type = strtolower($file_type[count($file_type) - 1]);
if ('pdf' !== $file_type) {
  // Give your feedback of choice here.
}

Если тип файла не PDF, то вы можете выдать ошибку, просто вернуться (хотя я не фанат этого) или дать отзыв пользователю (что я фанат делать).

<?php

if ($uploadFile['error']) {
  // Your preferred method of feedback here.
}

Однако последний шаг — загрузить файл в загрузчик мультимедиа.

3 Загрузка в медиа-загрузчик

Последним шагом во всем этом является загрузка файла в загрузчик мультимедиа. Для этого вам понадобится несколько вещей из ядра WordPress:

  1. библиотека file.php,
  2. массив вложений, необходимый, чтобы сообщить WordPress, что добавляется,
  3. функция API WordPress, wp_insert_attachment
  4. перенаправление обратно на вызывающую страницу

Звучит много, верно? Это не так уж плохо.

Обычно я группирую включение файловой библиотеки WordPress и wp_insert_attachment в один блок.

Вы заметите, что я установил тип MIME на pdf и удостоверился, что заголовок не содержит ничего, кроме имени файла. После этого я использую wp_insert_attachment для загрузки файла в медиатеку.

Полный код для этого выглядит следующим образом:

<?php

require_once(ABSPATH. "wp-admin". '/includes/file.php');
$attachment  = array(
    'post_mime_type' => 'pdf',
    'post_title'     => preg_replace('/.[^.]+$/', '', $filename),
    'post_status'    => 'inherit'
);
$attachment_id = wp_insert_attachment($attachment, $uploadFile['file']);

После этого я перенаправляюсь обратно на страницу, с которой все это началось (обычно это страница администратора, которую мы видели в предыдущем посте). Для этого я беру _wp_http_referer из массива PHP $_REQUEST.

<?php
wp_safe_redirect(
    $_REQUEST['_wp_http_referer'],
    301
);
exit;

И это перенаправит пользователя обратно на страницу, с которой он пришел.

И файл загружен

На данный момент мы определили, что мы хотим сделать:

  1. Дайте достойный клиентский опыт,
  2. Загрузил файл в медиатеку (с возможностью оставить отзыв)
  3. И перенаправили обратно на страницу, с которой все началось.

Конечно, в этом есть много места для отзывов, и я призываю вас адаптировать это по мере необходимости для вашего кода, но основа того, что вам нужно, должна быть предоставлена ​​как в предыдущем посте, так и в этом посте.

Источник записи: tommcfarlin.com

Этот веб-сайт использует файлы cookie для улучшения вашего опыта. Мы предполагаем, что вы согласны с этим, но вы можете отказаться, если хотите. Принимаю Подробнее