WP-DownloadManager – Reordenando os Registros na “Unha”

wpmanager

Quem trabalha com WordPress de forma profissional com certeza deve conhecer um plugin chamado WP-DownloadManager, do Lester Chan, um dos mais atuantes desenvolvedores de plugins para WordPress, veja alguns.

Pois bem, o Wp-DownloadManager é uma mão na roda para disponibilizar arquivos para download, permite criar categorias, ordenar a disponibilização dos arquivos e ainda faz estatísticas de download.

Tenho usado ele na intranet de um dos meus empregadores, com sucesso. Mas vamos aos problemas que precisei solucionar.

1.  Temos diversas categorias de downloads, e acertamos que a ordem que mostraríamos os arquivos aos usuários era os mais novos primeiros, ordenados pelo file_id dos arquivos, veja abaixo a tabela do plugin.

[sql]

CREATE TABLE  `wp_downloads` (
`file_id` int(10) NOT NULL auto_increment,
`file` tinytext NOT NULL,
`file_name` text NOT NULL,
`file_des` text NOT NULL,
`file_size` varchar(20) NOT NULL default ”,
`file_category` int(2) NOT NULL default ‘0’,
`file_date` varchar(20) NOT NULL default ”,
`file_updated_date` varchar(20) NOT NULL default ”,
`file_last_downloaded_date` varchar(20) NOT NULL default ”,
`file_hits` int(10) NOT NULL default ‘0’,
`file_permission` tinyint(2) NOT NULL default ‘0’,
PRIMARY KEY  (`file_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;

[/sql]

Tudo estava funcionando maravilhas,  os usuários fazem o upload dos arquivos, levando em consideração que os mais antigos devem ser inseridos primeiro, e ai será exibido como planejamos, ficando assim:

277/2009 – Designa Comissão Especial …..
» 42.5 KiB – 5 downloads – 02 de novembro de 2009

276/2009 – Designa Comissão Especial encarregada de elaborar …..
» 41.0 KiB – 3 downloads – 05 de novembro de 2009

275/2009 – Designa o servidor ….l
» 43.0 KiB – 2 downloads – 10 de novembro de 2009

O problema é que como a intranet atual foi migrada de uma versão anterior, onde não existia um CMS, vários arquivos foram inseridos a esmo, e que ao serem exibidos não correspondem a lista descrescente por nome, como no exemplo acima.

Embora que sistema permita mudar isso facilmente, isso não era possível de se fazer, pois iria afetar todas as outras categorias, pois as mudanças de ordenação são globais.

Vejamos a solução:

Primeiro foi dado um Select na tabela WP_DOWNLOADS para retonar o último FILE_ID.

[sql]

SELECT max(file_id) FROM  wp_downloads

[/sql]

retornou: 969

Com o uso de um contador, é possível simular uma contagem sequencial, veja:

[sql]

set @contador:=970;
SELECT (@contador:=@contador+1), wp_downloads.* FROM `wp_downloads` WHERE `file_category`= 10 order by `file_name` asc

[/sql]

Ou seja, a idéia é fazer com que os valores desse SELECT sequencial possa ser aplicado na coluna file_id da tabela wp_downloads.

Com a ajuda de meu amigo Edcley Firmino – o papa do SQL -,  chegamos a decisão de fazer uma Procedure utilizando RowID. Veja como ficou:

[sql]

BEGIN

DECLARE vcontador INT;
declare b,vfile_id int;
DECLARE cursor_1 CURSOR FOR SELECT file_id
FROM wp_downloads WHERE file_category= 10
order by file_name ASC;

DECLARE EXIT HANDLER FOR NOT FOUND SET b=1;
OPEN cursor_1;
set vcontador := 970;
REPEAT
FETCH cursor_1 INTO
vfile_id;
update wp_downloads
set file_id = vcontador
where file_id = vfile_id;
set vcontador := vcontador + 1;

UNTIL b=1 END REPEAT;
CLOSE cursor_1;

END

[/sql]

Pronto, ao executar-mos essa procedure, todos os registros da coluna File_ID foram atualizados, e então foi possível voltar a exibir corretamente os arquivos em ordem decrescente.

Funciona maravilhosamente bem… é isso.