Organização física da biblioteca de mídia wordpress (plugin Real Media Library)

22

Estrutura de pastas da Real Media Library

Introdução.

Na captura de tela acima, você pode ver uma estrutura de pastas criada com o plugin premium Real Media Library . Agora, quero criar um plug-in de extensão que possa organizar a estrutura de pastas na estrutura física de pastas - o RML é apenas uma estrutura visual.

Atualização # 2 (27/01/2017): confira a resposta!

Dê uma olhada na organização física da biblioteca de mídia do wordpress (plugin da Real Media Library), onde eu criei um plugin de extensão gratuita.

Atualização # 1 (14/12/2016): O primeiro sucesso: pasta de upload de miniaturas personalizada

Agora, eu criei outro plugin, o Real Thumbnail Generator , que permite criar uma pasta de upload de miniaturas personalizada. Basta dar uma olhada nesta captura de tela:

Pasta Upload real do gerador de miniaturas

Por que pastas de miniaturas personalizadas? As pastas de miniaturas personalizadas são mais fáceis de manter, porque aqui, não precisamos manter os URLs de atualização do banco de dados porque as miniaturas ainda estão no mesmo local (o que ainda não foi alterado pela extensão RML).

Se você quiser saber mais sobre o gerador de miniaturas personalizado, pode dar uma olhada neste segmento, onde expliquei uma abordagem técnica. Cada tamanho de imagem personalizado no diretório de upload personalizado? .

Continue neste tópico, porque no início de 2017 continuarei o desenvolvimento da extensão RML, que permite a sincronização entre o RML e a pasta de uploads do servidor. A extensão também é compatível com o plug-in Real Thumbnail Generator, portanto, deve haver a atualização do banco de dados.

Postagem original

Meu objetivo de extensão.

No momento, estou na pasta "/ Desorganizado", isso significa que é a pasta / wp-content / uploads /. Quando movo o arquivo (como você pode ver na captura de tela) para a pasta PDFs / SubDir, o arquivo está na pasta visual. Agora, minha extensão detecta a pasta diferente da pasta física e mostra um pequeno "botão" que permite ao usuário movê-la fisicamente também:

Botão para fisixá-lo

O usuário agora clica no botão "Physix it!" e o arquivo deve ser movido para /wp-content/uploads/pdfs/subdir/Another-Doc.pdf . Já criei o processo de movimentação: li todos os arquivos de mídia deste anexo (inclusive miniaturas de imagens) e uso a função php renomear ($ old_file, $ new_file) junto com a função WP wp_mkdir_p () . O GUID na tabela wp_posts e os metadados no wp_postmeta também são alterados.Quando todos os arquivos são movidos, chamo a ação:

<?php
do_action('RML/Physix/Moved', $meta, $id);
// $meta = Infos about the move process, see above screenshot
// $id = The attachment ID
?>

$ meta é uma matriz:

insira a descrição da imagem aqui

A chave "renomear" contém todos os processos de renomeação (por exemplo, aqui podem estar os arquivos em miniatura das imagens).

O problema: garantir a compatibilidade do plug-in.

O principal problema (se for) da biblioteca de mídia do WordPress é que muitos plugins salvam as referências a imagens com URLs completas, em vez do ID do anexo. Isso significa que existem tabelas MySQL com colunas que contêm uma URL para o arquivo especificado. Como posso garantir que TODAS as referências estejam atualizadas com as pastas físicas? Eu acho que é impossível.

Uma abordagem possível.

Eu me conecto à ação e atualizo as tabelas padrão como wp_post-> post_content , ... com uma instrução REPLACE recursiva no SQL.

<?php    
/**
 * When a attachment is moved.
 * 
 * @hooked RML/Physix/Moved
 */
function physix_moved($meta, $id) {
    $rename = $meta["rename"];

    // Prepare array for recursive REPLACE
    $arr = array();
    foreach ($rename as $value) {
        $arr[] = array($value["old_url"], $value["new_url"]);
    }
    $rec = $this->recReplace($arr, "post_content"); // function is already finished
}
?>

A variável $ rec agora é uma instrução REPLACE:

REPLACE(post_content, 'https://example.io/wp-content/uploads/Another-Doc.pdf', 'https://example.io/wp-content/uploads/pdfs/subdir/Another-Doc.pdf')

A propósito: Para uma imagem (testimage.jpg) com todos os arquivos em miniatura, pode ser assim:

REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(post_content, 'https://example.io/wp-content/uploads/testimage-750x350.jpg', 'https://example.io/wp-content/uploads/pdfs/subdir/testimage-750x350.jpg'), 'https://example.io/wp-content/uploads/testimage-1170x855.jpg', 'https://example.io/wp-content/uploads/pdfs/subdir/testimage-1170x855.jpg'), 'https://example.io/wp-content/uploads/testimage-256x187.jpg', 'https://example.io/wp-content/uploads/pdfs/subdir/testimage-256x187.jpg'), 'https://example.io/wp-content/uploads/testimage-1024x748.jpg', 'https://example.io/wp-content/uploads/pdfs/subdir/testimage-1024x748.jpg'), 'https://example.io/wp-content/uploads/testimage-300x219.jpg', 'https://example.io/wp-content/uploads/pdfs/subdir/testimage-300x219.jpg'), 'https://example.io/wp-content/uploads/testimage-150x150.jpg', 'https://example.io/wp-content/uploads/pdfs/subdir/testimage-150x150.jpg'), 'https://example.io/wp-content/uploads/testimage.jpg', 'https://example.io/wp-content/uploads/pdfs/subdir/testimage.jpg')

Mas o que acontece, se for uma string serializada (JSON) na tabela do banco de dados? Então parece{ "image": "http:\/\/example.io\/wp-content\/uploads\/Another-Doc.pdf" } . O que devo adicionar à declaração REPLACE?

A instrução REPLACE agora pode ser usada em todas as tabelas MySQL que contêm URLs de imagem. Pensei em criar uma matriz de filtros onde os plugins podem adicionar suas tabelas e minha extensão faz o resto:

<?php
$tables = apply_filters("RML/Physix/Moved/Tables", array( // TODO: use $wpdb->prefix
    "wp_posts" => array("post_excerpt", "post_content"),
    "wp_postmeta" => array("meta_value")
    //...
));
?>

O log "mover"

Eu quero criar um "log" em que os usuários possam desfazer movimentos. Se um usuário vir uma imagem quebrada (por exemplo, no plug-in Slider Revolution), ele poderá desfazer a mudança para a pasta original.

O que você acha dessa ideia? Existe uma solução melhor? Espero ter explicado tudo de uma maneira agradável!

Matthias Günter
fonte
9
Você não deve ver a estrutura de pastas subjacente aos anexos; em muitos casos, não existe (talvez os arquivos nem estejam no servidor? S3 AWS CDN etc.), o WordPress lida com postagens de anexo, não com arquivos de anexo e movê-los em um servidor é contraproducente. Você seria melhor fazer isso com uma taxonomia personalizada e reescrever as regras que desencadeiam um redirecionamento
Tom J Nowell
5
Embora essa seja uma excelente pergunta em termos de clareza / qualidade (+1 por esforço), no final das contas, estamos lidando com um plug-in de terceiros aqui, que é considerado fora de tópico - acho que ninguém será capaz de "rapidamente" ajudá-lo sem ser seriamente investido em RML.
TheDeadMedic #
@TheDeadMedic Sim, isso é verdade. Mas eu fiz a pergunta da maneira, que você sabe como funciona com as ações no RML. Esta pergunta não é específica da RML, é mais específica do banco de dados - como resolver o problema com a substituição da URL.
Matthias Günter
2
E mais um +1 por esforço - gostaria que tivéssemos mais dessas perguntas ... como tínhamos nos primeiros dias. De qualquer forma, os principais problemas estão descritos acima. Para deixar claro: você poderia fazer uma edição e explicar o motivo do que está tentando? Até o momento, não faz sentido executar essas tarefas do sistema de arquivos.
Kaiser #
Como você foi com esse @ MatthiasGünter? Você conseguiu encontrar uma solução?
Tim Malone

Respostas:

1

Extensão gratuita da solução "Pasta de upload personalizada física"

Há muito tempo, comecei a abrir esse tópico e agora existe um plug-in de extensão utilizável para o Real Media Library, que permite gerenciar fisicamente sua pasta de uploads .

insira a descrição da imagem aqui

Confira este plugin: https://wordpress.org/plugins/physical-custom-upload-folder/

Você conhece a pasta wp-content / uploads? Lá, os arquivos são armazenados em pastas com base no ano / mês. Este pode ser um processo muito complicado e em massa, especialmente quando você está trabalhando com um cliente FTP como o FileZilla.

Movendo arquivos já enviados: este plug-in não permite mover os arquivos fisicamente quando você move um arquivo na Real Media Library porque o WordPress usa os URLs em locais diferentes. É muito difícil manter esse processo. Portanto, isso funciona apenas para novos envios.

Matthias Günter
fonte