Como o WordPress gera slugs de URL?


Respostas:


16

Imediatamente, não posso fornecer uma página / tutorial / documentação sobre como as lesmas WP são geradas, mas dê uma olhada na sanitize_title()função.

Não obtenha uma impressão errada pelo nome da função, pois não pretende higienizar um título para uso posterior como título de página / postagem . Ele pega uma string de título e a retorna para ser usada em uma URL:

  • tiras de HTML e PHP
  • tiras caracteres especiais
  • converte todos os caracteres em maiúsculas
  • substitui espaços em branco, sublinhados e pontos por hífens / traços
  • reduz vários traços consecutivos para um

Não pode haver casos de ponta, onde o núcleo faz algo adicional (você tem que olhar para a fonte para verificar se sanitize_title()será sempre suficiente para gerar exatamente o mesmo que você espera), mas isso deve cobrir pelo menos 99%, se não todos, os casos .


1
@kaiser: Achei que você está simplesmente apaixonado pelo T5 Rewrite :) (que está na minha agenda para conferir) | e geralmente: se um título é realmente longo, o WP também corta as lesmas até um certo comprimento máximo. Esse é um daqueles casos em que não tenho certeza absoluta se isso também foi feito pelo sanitize_titlefiltro aplicado na função ou se foi tratado por outra coisa após a execução da função.
Johannes Pille

Eu acho que é o sanitize_titlefiltro que é preciso verificar. Mas também há outras funções relacionadas . Eu realmente não tenho idéia sobre isso. Às vezes parece que SimplePieé mais fácil entender do que WP_Rewriteisso. Btw: Toscho trabalha na integração da funcionalidade "Monkeyman Rewrite Analyzer" em seu plugin. É aí que as coisas começam a ficar realmente interessantes.
Kaiser

1
Considere também sanitize_title_with_dashes () se você quiser ser um pouco mais explícito sobre a geração de uma lesma amiga da URL.
Tom Auger

5

Você pode usar esta função:

static public function slugify($text)
{
  // replace non letter or digits by -
  $text = preg_replace('~[^\pL\d]+~u', '-', $text);

  // transliterate
  $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);

  // remove unwanted characters
  $text = preg_replace('~[^-\w]+~', '', $text);

  // trim
  $text = trim($text, '-');

  // remove duplicate -
  $text = preg_replace('~-+~', '-', $text);

  // lowercase
  $text = strtolower($text);

  if (empty($text)) {
    return 'n-a';
  }

  return $text;
}

É exatamente como a função wp url sanitize funciona.


4

Núcleo ao seu serviço

Além do WordPress , não há um modo de desenvolvedor incorporado WP_DEBUG, o que não ajuda muito nesse caso. Basicamente, o WP usa a "API de reconfiguração" , que é um wrapper de baixo nível baseado em função para a WP_Rewriteclasse, sobre o qual você pode ler no Codex . O global $wp_rewriteobjeto está ao seu serviço para inspecioná-lo ou interagir com a classe.

Plug-ins que ajudam a analisá-lo.

Toschos "T5 Rewrite" - Plugin e Jan Fabrys "Monkeyman Rewrite Analyzer" - Plugin o guiarão no seu caminho. Eu escrevi uma pequena extensão para o "T5 Rewrite" para integrá-lo sem problemas ao "Monkeyman Rewrite Analyzer", que você pode encontrar no repositório de publicações "T5 Rewrite" aqui no GitHub .

O plug-in "Monkeyman" adiciona uma nova página, arquivada no menu da UI do administrador em Ferramentas . O plug-in "T5 Rewrite" adiciona uma nova guia de ajuda à página Configurações > Links permanentes . Minha extensão também adiciona as guias de ajuda à página Ferramentas mencionada .

Aqui está uma captura de tela da aparência dos plug-ins "T5 Rewrite", que ajudam o conteúdo da guia.

insira a descrição da imagem aqui

Vorlage = Padrão | Descrição = Explicação | Beispiele = Exemplos

Notas

O plug-in "T5 Rewrite" faz um trabalho maravilhoso ao ajudá-lo a inspecionar o objeto de reescrita. E faz ainda mais: adiciona novas possibilidades. Portanto, é (pelo menos em minhas instalações) parte do meu pacote básico de plugins.


2

Na verdade, se você olhar a função principal wp_insert_post (post.php), verá que ele faz o seguinte:

$data['post_name'] = wp_unique_post_slug( sanitize_title( $data['post_title'], $post_ID ), $post_ID, $data['post_status'], $post_type, $post_parent );

$wpdb->update( $wpdb->posts, array( 'post_name' => $data['post_name'] ), $where );

O principal aspecto a ser observado é que usa wp_unique_post_slug e sanitize_title:

wp_unique_post_slug( sanitize_title( 

0

Perdoe por retomar uma pergunta antiga, mas tive a mesma necessidade que descobri que esse método funciona perfeitamente para mim:

$some_string = "DON'T STOP ME NOW!";
$slug = sanitize_title(sanitize_title($some_string, '', 'save'), '', 'query');
echo $slug; // dont-stop-me-now

Este método usa uma desinfecção dupla.

O primeiro usa o savemodo, em que as tags HTML e PHP são removidas e os acentos são removidos (caracteres acentuados são substituídos por equivalentes não acentuados).

O segundo querymodo garante que todos os espaços sejam substituídos por traços -e outras pontuações removidas.

Espero que isso ajude alguém! :)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.