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