✅ Notícias, temas e plug-ins da WEB e do WordPress. Aqui compartilhamos dicas e as melhores soluções para sites.

Carregando arquivos no WordPress revisitado, parte 2 – O lado do servidor

18

Antes de pular direto para o código para isso, eu queria mencionar duas coisas:

  1. Sim, eu cobri isso com alguns detalhes há algum tempo,
  2. E esta é a segunda parte de uma série de duas partes.

Se você não leu a primeira parte, faça-o primeiro. A ideia é que o código funcione em conjunto com o que vou abordar neste post para garantir que tanto o lado do cliente quanto o lado do servidor sejam cobertos.

Em última análise, a razão para dividi-lo assim não é apenas garantir que as coisas sejam feitas corretamente, mas também garantir que o usuário tenha a experiência mais positiva possível.

Com isso dito, veja como fazer o upload de arquivos no WordPress no lado do servidor.

Carregando arquivos no WordPress no lado do servidor

Observe que, embora existam algumas verificações de segurança que podem – e devem – ser feitas, ainda não encontrei uma maneira completamente infalível de detectar que o arquivo que está sendo carregado é do tipo adequado.

Isso significa que ainda há uma chance de que um tipo de arquivo incorreto possa ser carregado. Se isso é malicioso ou não, obviamente depende do usuário final. Compartilho apenas isso para deixar claro que o código que vou mostrar é o melhor que posso fornecer, mas ainda há um nível de discrição que você deve usar.

Talvez valha a pena procurar uma biblioteca de terceiros para validar os dados binários depois de recebidos. Mas eu discordo.

1 Verifique as permissões do usuário

Lembre-se de que sempre que criamos o front-end, fazemos com que o WordPress gere um nonce para que possamos usá-lo para garantir que o usuário tenha permissão para fazer upload do arquivo.

Além de verificar o nonce, há várias outras coisas que gosto de verificar, todas agrupadas em um método chamado userCanSave.

Primeiro, lembre-se do front-end:

<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>

Então dê uma olhada como eu uso isso no código. Primeiro, defino a função 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);
}

E então eu simplesmente chamo isso no início do processo. Se falhar, eu volto.

<?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...

}

Eu recomendo mostrar uma mensagem de erro, mas eu discordo neste ponto, pois existem algumas maneiras de fazer isso dentro do post.

2 Carregue o arquivo

Supondo que o usuário tenha permissão para verificar o arquivo, é seguro fazer upload do arquivo. O processo para fazer isso é direto, mas ainda requer um pouco de trabalho com a API do WordPress (ou seja, com a função wp_upload_bits ).

Primeiro, o arquivo precisa ser obtido do $_FILES global do PHP e então carregado. Ao fazer isso, porém, é importante certificar-se de que você está enviando um arquivo com a extensão de arquivo correta (no mínimo).

<?php

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

Se o tipo de arquivo não for um PDF, você poderá lançar um erro, simplesmente retornar (embora eu não seja fã disso) ou dar algum feedback ao usuário (o que sou fã de fazer).

<?php

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

A última etapa, porém, é colocar o arquivo no carregador de mídia.

3 Carregando no Media Uploader

A última etapa de tudo isso é colocar o arquivo no carregador de mídia. Para fazer isso, você precisa de várias coisas do núcleo do WordPress:

  1. a biblioteca arquivo.php,
  2. uma matriz de anexos necessária para informar ao WordPress o que está sendo adicionado,
  3. uma função de API do WordPress, wp_insert_attachment
  4. redirecionando de volta para a página de chamada

Parece muito, certo? Não é tão ruim.

Eu costumo agrupar a inclusão da biblioteca de arquivos do WordPress e o wp_insert_attachment em um único bloco.

Você notará que defino o tipo MIME como pdf e me certifico de que o título não inclua nada, exceto o nome do arquivo. Depois disso, uso wp_insert_attachment para carregar o arquivo na Biblioteca de mídia.

O código completo para isso é o seguinte:

<?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']);

Depois disso, redireciono de volta para a página que iniciou tudo isso (que geralmente é a página de administração que vimos no post anterior. Para isso, pego o _wp_http_referer do array $_REQUEST do PHP .

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

E isso redirecionará o usuário de volta à página de onde veio.

E o arquivo é carregado

Neste ponto, definimos o que queremos fazer:

  1. Ofereça uma experiência decente do lado do cliente,
  2. Carregou o arquivo na biblioteca de mídia (com oportunidades para oferecer feedback)
  3. E redirecionado de volta para a página que começou tudo.

É verdade que há muito espaço para feedback nisso, e peço que você adapte isso conforme necessário para o seu código, mas a base do que você precisa deve ser fornecida tanto no post anterior quanto neste post.

Fonte de gravação: tommcfarlin.com

Este site usa cookies para melhorar sua experiência. Presumiremos que você está ok com isso, mas você pode cancelar, se desejar. Aceitar Consulte Mais informação