Como definir a estrutura do permalink via functions.php

10

Estou montando uma rede Wordpress e queria que todos os novos sites tivessem a mesma estrutura de link permanente (por exemplo, "/% year% /% monthnum% /% postname% /"). Gostaria de saber se isso é possível através de ganchos ou hacks em functions.php, sem ter que confiar nos usuários para escolher essa estrutura.

Tomas Buteler
fonte

Respostas:

15

Você pode definir a estrutura do permalink chamando o set_permalink_structure()método do $wp_rewriteobjeto global .

add_action( 'init', function() {
    global $wp_rewrite;
    $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
} );

Aqui está uma versão PHP <5.3 do código, caso você esteja recebendo erros.

function reset_permalinks() {
    global $wp_rewrite;
    $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
}
add_action( 'init', 'reset_permalinks' );
soulseekah
fonte
Copiar e colar seu código gera um erro, mas a lógica faz o truque! Eu só me pergunto se minhas perguntas / intenções são boas práticas, embora ...
Tomas Buteler 16/16
11
Tomas, obrigado por aceitar a resposta. Fico feliz em ter sido de ajuda. Quanto às boas práticas - acho que, se seu objetivo é impor e bloquear essa estrutura de links permanentes entre sites - isso é justificável; e com 'bloqueio', quero dizer que o código não permitirá alterações na estrutura via Admin, se estiver tudo bem, então eu acho que é totalmente aceitável fazer isso.
soulseekah
11
Funciona, mas causa um conflito quando o administrador salva da página do link permanente (404 nas postagens). Então, quando o site é carregado (processo de inicialização do gancho), a estrutura do link permanente muda novamente (404 nas postagens novamente). usando $wp_rewrite->flush_rules();resolve o problema. Má prática para usá-lo no init e executá-lo sempre. Apenas visitando a página de links permanentes fará os truques.
Sisir
11
A intenção era desabilitar a página de opções de links permanentes, para que eu possa me safar?
Tomas Buteler
3
Ele deve ser chamado em 'after_switch_theme' ou na ativação do plug-in e seguido por 'flush_rewrite_rules ()'
csstd
2

Resposta anterior não está funcionando. Eu obtive uma solução pura. Pode usar Use este código. Isso funcionará 100%. obrigado

/**
 * Rewrite set up, when theme activate i mean
 */
if (isset($_GET['activated']) && is_admin()) {
    global $wp_rewrite;
    $wp_rewrite->set_permalink_structure('/%postname%/');
    $wp_rewrite->flush_rules();
}

/**
* Redirect to Permalink setting Page.
* Otherwise Redirect rule will not work Properly.
*/
function redirect_to_permalink() {

    wp_redirect('options-permalink.php');
}
add_action( 'after_switch_theme', 'redirect_to_permalink' );
Saiful Islam
fonte
0
function setPermaLink(){
    $ps = '/%category%/%postname%/';
    $permalink_structure = sanitize_option( 'permalink_structure', $ps);
    $blog_prefix = '/blog';
    $prefix = '/index.php';

    if ( ! empty( $permalink_structure ) ) {
        $permalink_structure = preg_replace( '#/+#', '/', '/' . str_replace( '#', '', $permalink_structure ) );
        if ( $prefix && $blog_prefix ) {
            $permalink_structure = $prefix . preg_replace( '#^/?index\.php#', '', $permalink_structure );
        } else {
            $permalink_structure = $blog_prefix . $permalink_structure;
        }
    }

    $wp_rewrite->set_permalink_structure( $permalink_structure );
    flush_rewrite_rules();
}

setPermaLink();
Ricardo Boavida
fonte