Como utilizar copy_dir() no WordPress (PHP)3 min leitura

Explicação de como utilizar a função copy_dir() do WordPress, com um exemplo prático de código PHP para fazer a cópia de uma pasta dentro do diretório de uploads para uma nova pasta no mesmo diretório.

Com a função copy_dir() você copia o conteúdo de uma pasta de uma localização para outra, utilizando a abstração do sistema de arquivos do WordPress. Ela possui três parâmetros:

  1. $from: (string) caminho da pasta de origem – obrigatório;
  2. $to: (string) caminho da pasta de origem – obrigatório. Importante: Esta pasta já deve existir, caso contrário a função irá retornar um erro;
  3. $skip_list: (string[]) um array com os arquivos ou pastas a serem ignorados – opcional;

Veja abaixo dois exemplos de como utilizá-la:

<?php
// Faz a cópia dos arquivos de uma pasta para outra.
copy_dir( $pasta_origem, $pasta_destino );

// Faz a cópia dos arquivos de uma pasta para outra,
// com uma lista de arquivos e pastas para ignorar.
$lista_ignorar = array(
    "ignorar-arquivo.txt",
    "ignorar-pasta"
);
copy_dir( $pasta_origem, $pasta_destino, $lista_ignorar );
Code language: PHP (php)

A função copy_dir() assume que a função WP_Filesystem() foi chamada e configurada. Para fazer isso, você pode utilizar o código abaixo abaixo:

<?php
global $wp_filesystem;
 
require_once( ABSPATH . '/wp-admin/includes/file.php' );

// Verifica conexão com sistema de arquivos
if ( ! WP_Filesystem() ) {
    // Não foi possível conectar.
    exit;
}
Code language: PHP (php)

Como fazer a cópia de uma pasta dentro do diretório de uploads para uma nova pasta no mesmo diretório

Como exemplo prático, criei um código que faz a cópia do conteúdo de uma pasta dentro do diretório de uploads do WordPress para outra pasta no mesmo diretório. Veja como ficou no código abaixo:

<?php
// Carrega o código do sistema de arquivos do WordPress.
global $wp_filesystem;
 
require_once( ABSPATH . '/wp-admin/includes/file.php' );

// Verifica conexão com sistema de arquivos.
if ( ! WP_Filesystem() ) {
    // Não foi possível conectar, para a execução do código.
    exit;
}

// Obtém o caminho da pasta de uploads do WordPress.
$uploads = wp_get_upload_dir();
$base_uploads = $uploads["basedir"];

// Informações da pasta de origem
$pasta_origem = path_join( $base_uploads, "origem/" );

// Lista de arquivos e pastas a serem ignorados na cópia.
$lista_ignorar = array(
    "ignorar-arquivo.txt",
    "ignorar-pasta"
);

// Informações da pasta de destino.
$pasta_destino = path_join( $base_uploads, "destino/" );

// Verifica se pasta destino existe, caso contrário, cria ela.
if ( wp_mkdir_p( $pasta_destino ) ) {

    // Faz a cópia dos arquivos de uma pasta para outra,
    // com uma lista de arquivos e pastas para ignorar.
    $copia_pasta = copy_dir( $pasta_origem, $pasta_destino, $lista_ignorar );

    // Verifica se houve algum erro
    if ( ! is_wp_error( $copia_pasta ) ) {
        _e( 'Pasta copiada com sucesso.', 'danielkossmann' );
    } else {
        // Obtém mensagem de erro
        $erro = $nova_conta->get_error_message();

        // Exibe as informações de forma que o conteúdo seja traduzível
        printf(
            __( 'Ocorreu o seguinte erro ao copiar a pasta: %s', 'danielkossmann' ),
            $erro
        );	        
    }
}
Code language: PHP (php)

No código acima utilizei algumas funções auxiliares, veja abaixo mais detalhes de cada uma delas:

  1. require_once() para incluir o arquivo como obrigatório, verificando antes se ele já foi incluído.
  2. WP_Filesystem() para iniciar a abstração do sistema de arquivos do WordPress.
  3. exit para finalizar a execução do código.
  4. wp_get_upload_dir() para obter as informações do diretório de envio de arquivos (uploads) do WordPress.
  5. path_join() para gerar um caminho de arquivos a partir de uma base e um caminho relativo à ela.
  6. wp_mkdir_p() para criar recursivamente um diretório a partir do seu caminho completo.
  7. is_wp_error() para tratar erros.

Aviso importante: Estes códigos foram criados apenas para fins didáticos, por isso nem sempre possuem todas as melhores práticas de segurança e otimizações necessárias. Portando, não me responsabilizo pelo seu uso em qualquer tipo de ambiente ou dou qualquer tipo de garantia para eles. Se você desejar utilizá-los será por sua própria conta e risco.

Posts Similares

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *