Fórum OpenCart Brasil

Por um e-commerce livre, confiável e profissional

#37309
Pessoal,

Gostaria da ajuda de vocês para melhorar e implementar o código que fiz para otimizar melhor as imagens da loja nos buscadores.

O que pensei foi em uma pagina.php que varre-se todas as imagens dos produtos, e, ajusta-se o nome delas, tanto no servidor, como no banco de dados, para o nome + id do produto.

Então desenvolvi a pagina php abaixo que ja me atendeu. Porém, sei que a estruturação do código está totalmente gambiarra, e podemos melhorar bastante esse codigo para ficar mais otimizado e ajustar os problemas que ocorrer.

Lembrando que a minha versão do OC é a 1.5.5.1 e não sei se funciona em outras versões.

------------------------------------------------------------------------------------------------------------------------------------------------------

Consegui fazer funcionar e está funcionando para os testes que fiz. Caso queiram experimentar, façam em uma loja de teste pois nao me responsabilizo por danos na sua loja =)

Para utilizar faça:

1 - Crie um arquivo.php no diretorio image/data/arquivo.php
2 - Copie e cole o codigo abaixo no conteudo do arquivo.
3 - Altere os dados de conexao com banco de dados.
4 - Altere o caminho da pasta imagem
5 - Acesse o arquivo http://www.sualoja.com.br/image/data/arquivo.php
6 - Apos a execução verifique que os nomes dos arquivos dos seus produtos foram atualizados.

Regras de Atualização de Nomes

a. As imagens terão seu nome ajustados de acordo com as melhores praticas de SEO, utilizando o nome do produto (atualmente deve ser unico, mas da para ajustar)
b. Caso haja outro produto com a mesma imagem, o nome NAO será atualizado
c. Caso haja outro produto com a mesma imagem nos DETALHES, o nome NÃO será atualizado
d. As diversas imagens do mesmo produto, terão o ID do detalhe no nome da imagem

Sintan-se à vontade para ajustar ou melhorar o script.

Obrigado =]
Código: Selecionar todos
<?php

[color=#FF0000]define('DB_DRIVER', 'mysql'); //colocar o driver
define('DB_HOSTNAME', 'localhost'); //colocar o host
define('DB_USERNAME', 'user'); //colocar o user
define('DB_PASSWORD', 'senha'); //colocar a senha
define('DB_DATABASE', 'database'); //colocar o banco
define('DB_PREFIX', 'oc_'); //colocar o prefixo usado nas tabelas[/color]

$link = mysql_connect(DB_HOSTNAME, DB_USERNAME,DB_PASSWORD);

mysql_select_db(DB_DATABASE);
if (!$link) {
    die('Não foi possível conectar: ' . mysql_error());
}else
{
echo "Conexao com o banco de dados feita com sucesso!<BR>";
}





// Varre o diretorio corrente 
function ajustaimg(){

$dir_inicial = strlen("[color=#40BFFF][color=#FF0000]/home/USUARIO/public_html/image/[/color][/color]"); //Caminho onde estão as imagens que serão tratadas ex.: /home/USUARIO/public_html/image/

function toSeo($str){
    $str = strtolower(utf8_decode($str)); $i=1;
    $str = strtr($str, utf8_decode('àáâãäåæçèéêëìíîïñòóôõöøùúûýýÿ'), 'aaaaaaaceeeeiiiinoooooouuuyyy');
    $str = preg_replace("/([^a-z0-9])/",'-',utf8_encode($str));
    while($i>0) $str = str_replace('--','-',$str,$i);
    if (substr($str, -1) == '-') $str = substr($str, 0, -1);
    return $str;
}


function str_replace_last($string ,$search , $replace){
 
   if ((($string_len=strlen($string))==0) || (($search_len=strlen($search))==0)) return $string;
   $pos=strrpos($string,$search);
   if ($pos>0) return substr($string,0,$pos).$replace.substr($string,$pos+$search_len,max(0,$string_len-($pos+$search_len)));
   return $string;
}


// Funçao de Varredura de Arquivo
function varre_pasta($pasta,$str){

   $str = $str;
   
   
   //Scanei todos os arquivos dentro da pasta
   $folder = scandir($pasta);

   //Para cada registro encontrado verifica
   foreach ($folder as $dir)
   {
      //Verifica se não sao os diretorios de sistema . e ..
      if ($dir!="." and $dir!=".."){
         
         //Se for um diretorio, entra dentro dele e comeca novamente o processamento
         if (is_dir($pasta . "/" . $dir) ){
         
            //Troca de diretorio
            chdir($pasta . "/" . $dir); 
            varre_pasta(getcwd(),$str);
            
         }
         
         //Se for um arquivo faz o processamento
         elseif (file_exists($pasta . "/" . $dir)){
            $caminho_original = $pasta . "/" . $dir;

            //Pega a Extensao para ver se é imagem             
            $ext = (substr($dir, -4));
             if($ext[0] == '.'){
                $ext = (substr($dir, -3));
             }
            
            $ext_original = $ext;
            $ext = strtolower($ext);
             
             //Verifica se sao as extensoes permitidas   
             if ( $ext == "jpg" or $ext == "jpeg" or $ext == "png" or $ext == "gif" ){
                
               
               $nomearq_original = basename($caminho_original);
               
                $caminho = strtolower(substr(($pasta . "/" . $dir),$str)); 
               $nomearq = basename($caminho);
               $nomearqseo = str_replace_last(toSeo($nomearq),"-" , ".");
               
               
               // Verifica no banco de dados se há algum produto com esta imagem cadastrada.
               // Se tiver mais do que um produto, não altera e informa em tela.

               // Tabela Image
               $varSql = "SELECT des.product_id, des.name, lower(pro.image) image FROM " .DB_PREFIX. "product pro, ". DB_PREFIX. "product_description des where pro.product_id = des.product_id and lower(pro.image) = '" .$caminho. "' ";
               $result = mysql_query($varSql) or die('Query failed: ' . mysql_error() . "<br />\n$sql");
               $num_rows = mysql_num_rows($result);
               $err = 0;
               if ($num_rows > 1) {
                  // echo $nomearq . " -> Esta imagem está atribuida a mais de um produto. Não será ajustada<BR>";
                  $err = 1;
               }elseif ($num_rows == 1){
                  
                  
                  $varSql = "SELECT des.product_id, des.name, pro.product_image_id FROM " .DB_PREFIX. "product_image pro, ". DB_PREFIX. "product_description des where pro.product_id = des.product_id and lower(pro.image) = '" .$caminho. "' ";
                  $result2 = mysql_query($varSql) or die('Query failed: ' . mysql_error() . "<br />\n$sql");
                  $num_rows2 = mysql_num_rows($result2);
                  
                  if ($num_rows2 > 0){
                     // echo $nomearq . " -> Esta imagem está atribuida na tabela de imagens adicionais, não será ajustada<BR>";
                     $err = 1;                     
                  }
                  
                  if ($err == 0) {
                     //Atualizando imagem na tabela de produto
                     
                     $row = mysql_fetch_array($result);
                     
                     $ext = strtolower(substr($row['image'], -4));
                     if($ext[0] == '.'){
                        $ext = strtolower(substr($row['image'], -3));
                     }
                                       
                     $nomearqseo = str_replace_last(toSeo($row['name'].".".$ext),"-" , ".");
                     $nomearqseocompleto = dirname($caminho)."/".$nomearqseo;
                     
                     $varSql = "UPDATE  " .DB_PREFIX. "product pro SET  pro.image = '". $nomearqseocompleto ."' WHERE lower(pro.image) = '" .$caminho. "' "  ;
                     
                     if (mysql_query($varSql)){
                        echo $nomearq . " -> Imagem ajustada na tabela de produto<BR>";
                        if (rename($caminho_original ,dirname($caminho_original)."/".$nomearqseo)){
                           echo "Imagem ajustada no servidor de: " . $caminho_original . "<b> para </b>" . dirname($caminho_original)."/".$nomearqseo . " <BR>";
                        }
                     }else{
                        die('Query failed: ' . mysql_error() . "<br />\n$sql");
                     }
                  }
                  
                  
               }else{
                  
                  $varSql = "SELECT distinct des.product_id FROM " .DB_PREFIX. "product_image pro, ". DB_PREFIX. "product_description des where pro.product_id = des.product_id and lower(pro.image) = '" .$caminho. "' ";
                  $result3 = mysql_query($varSql) or die('Query failed: ' . mysql_error() . "<br />\n$sql");
                  $num_rows3 = mysql_num_rows($result3);
               
                  if ($num_rows3 == 1){
                     
                     
                     $varSql = "SELECT * FROM " .DB_PREFIX. "product_image pro, " .DB_PREFIX. "product_description des where pro.product_id = des.product_id and lower(pro.image) ='" .$caminho. "' ";
                     
                     $resulta = mysql_query($varSql) or die('Query failed2: ' . mysql_error() . "<br />\n$sql");
                     
                     // Atualizar na tabela de produtos
                     $row = mysql_fetch_array($resulta);
                     
                     $ext = strtolower(substr($row['image'], -4));
                     if($ext[0] == '.'){
                        $ext = strtolower(substr($row['image'], -3));
                     }
                                       
                     $nomearqseo = str_replace_last(toSeo($row['name']."-".$row['product_image_id'].".".$ext),"-" , ".");
                     $nomearqseocompleto = dirname($caminho)."/".$nomearqseo;
                     
                     $varSql = "UPDATE  " .DB_PREFIX. "product_image pro SET  pro.image = '". $nomearqseocompleto ."' WHERE lower(pro.image) = '" .$caminho. "' "  ;
                     
                     if (mysql_query($varSql)){
                        echo $nomearq . " -> Imagem ajustada na tabela de produto<BR>";
                        if (rename($caminho_original ,dirname($caminho_original)."/".$nomearqseo)){
                           echo "Imagem ajustada no servidor de: " . $caminho_original . "<b> para </b>" . dirname($caminho_original)."/".$nomearqseo . " <BR>";
                        }
                     }else{
                        die('Query failed: ' . mysql_error() . "<br />\n$sql");
                     }
                     
                     
                  }else{
                     // echo $nomearq . " -> Esta imagem está atribuida a mais de um produto, ou nao está cadastrada na tabela de imagens adicionais, não será ajustada<BR>";
                     $err = 1;
                  }                  
                  
                  
               
               }


             }
             
         }
         
         
         else{
            return;
         }
      }
      

   }

   return;
}

varre_pasta(getcwd(),$dir_inicial);


}


ajustaimg();

?>

Gente preciso de ajuda urgente. Na migraç&a[…]

Caro @reds , muito obrigado pela resposta.

PHP 8+ incompatibilidade

Toda tradução para a versão 3[…]

Ola @alex3257 Se você precisa apenas ver […]