permalink independente do nome do post armazenado no banco de dados

4

Estou tentando criar uma estrutura personalizada de permalink para minhas postagens.

www.example.com / post / %post_id% / %posttitle% /

Nesse permalink, o ID do post vem primeiro, depois o título do post depois dele.

Coisas que conheço até agora

postname é normalmente armazenado na tabela wp_posts na linha post_name e controla o URL da postagem. ou seja: se o post_name da postagem for my-post-name , o URL padrão será www.example.com/post/my-post-name .

os nomes dos posts são armazenados no banco de dados de forma que cada postagem tenha um nome de postagem exclusivo. Se duas postagens tiverem o mesmo título (por exemplo, new-advanced-topic ), o nome da primeira postagem será new-advanced-topic e o nome da segunda postagem será new-advanced-topic-2 . E assim, os URLs serão diferentes uns dos outros.

O que eu quero

Mas eu não quero que o URL do post dependa do nome do post armazenado no banco de dados.

A estrutura que eu quero é semelhante a

www.example.com / post / %post_id% / %posttitle% /

Suponha que haja 2 postagens armazenadas no banco de dados com esses valores

╔════╦════════════════════╦═════════════════════╗
║ ID ║     post_title     ║      post_name      ║
╠════╬════════════════════╬═════════════════════╣
║ 25 ║ new-advanced-topic ║ new-advanced-topic  ║
║ 26 ║ new-advanced-topic ║ new-advanced-topic2 ║
╚════╩════════════════════╩═════════════════════╝
  • Eu quero que o URL do post dependa apenas do ID do post. Portanto, se o usuário solicitou www.example.com/post/25/pla-pla-pla , a postagem que será exibida é a que é identificada por 25.
  • Quando um usuário solicita o link www.example.com/post/{%post_id%}/pla-pla-pla , eu quero que o WordPress o redirecione para www.example.com/post/{%post_id%}/{%post_title%} .

Portanto, se o usuário solicitar www.example.com/post/25/pla-pla-pla , o WordPress o redirecionará para www.example.com/post/25/new-advanced-topic e exibirá a postagem com ID=25 .

E se o usuário solicitar www.example.com/post/26/new-advanced-topic2 , o WordPress o redirecionará para www.example.com/post/26/new-advanced-topic e exibirá a postagem com ID=26 .

E se o usuário solicitar www.example.com/post/100/new-advanced-topic , um erro 404 deverá aparecer para ele, pois não há postagem armazenada no banco de dados com ID=100 .

Eu tentei escrever uma nova regra de rewrite para fazer isso, mas não consegui encontrar uma forma de escrever sua regex.

Como posso fazer isso usando as regras wp_rewrite .

    
por Yazan W Yusuf 02.02.2016 / 21:48

2 respostas

1

Temos que fazer isso mantendo post_name exclusivo. Caso contrário, isso pode causar muitos problemas. Podemos usar post_title com sanitize_title . Dessa forma, você pode manter seu URL legal e limpo, e seu post_name permanecerá exclusivo também.

Primeiro, precisamos criar uma estrutura personalizada de permalink.

function my_awesome_permalink( $url, $post, $leavename ) {
    $url= trailingslashit( home_url('/post/'. $post->ID .'/'. sanitize_title($post->post_title) .'/' ) );
    return $url;
}
add_filter( 'post_link', 'my_awesome_permalink', 10, 3 );

Agora, nossa estrutura de permalink personalizada está pronta. Ele se tornará www.example.com/post/{%post_id%}/{%post_title%} , por exemplo: www.example.com/post/25/my-awesome-post-title . Precisamos adicionar uma regra de reescrita adequada para fazer o WP entender e retornar a postagem correta.

add_action('generate_rewrite_rules', 'custom_rewrite_rules');
function custom_rewrite_rules( $wp_rewrite ) {
    $new_rules['^post/([0-9]+)/([^/]+)/?'] = 'index.php?p=$matches[1]';
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
    return $wp_rewrite;
}

Com o código acima, você poderá transformar sua estrutura permalink de postagens em www.example.com/post/25/my-awesome-post-title e exibir a postagem correta.

Um problema com o código acima é que você não poderá editar o slug de postagem do editor de postagem. Mas o seu URL do post agora vem do título do post, que é editável!

    
por тнє Sufi 10.02.2016 / 14:42
0

O que eu entendo é que você quer usar o ID do post em vez do Título da postagem .

e você tem problemas por causa do mesmo nome de títulos.

Se isso é certo, a solução será como seguir:

1 - mude permalink para estrutura personalizada como na figura a seguir

2-váparaphpmyadminemudeoseunomedaspostagenscomonafiguraaseguir

    
por heshamhussain 03.02.2016 / 04:06