Как установить структуру постоянных ссылок через functions.php


10

Я настраивал сеть Wordpress и хотел, чтобы все новые сайты имели одинаковую структуру постоянных ссылок (т.е. "/% year% /% monthnum% /% postname% /"). Мне интересно, возможно ли это сделать через hooks или hacks в functions.php, без необходимости полагаться на пользователей, чтобы выбрать эту структуру.

Ответы:


15

Вы можете установить структуру постоянных ссылок, вызвав set_permalink_structure()метод глобального $wp_rewriteобъекта.

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

Вот версия кода PHP <5.3 на случай, если вы получите ошибки.

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

Копирование и вставка вашего кода приводит к ошибке, но обоснование делает свое дело! Мне только интересно, если мой вопрос / намерения являются хорошей практикой, хотя ...
Томас Бутелер

1
Томас, спасибо, что приняли ответ. Рад был помочь. Что касается хороших практик - я думаю, что если ваша цель состоит в том, чтобы обеспечить и зафиксировать такую ​​структуру постоянных ссылок на веб-сайтах - тогда это оправдано; и под «замком» я подразумеваю, что код не допустит никаких изменений в структуре через администратора, если это нормально, то я считаю, что это вполне нормально делать.
soulseekah

1
Это работает, но это вызывает конфликт, когда администратор сохраняет со страницы постоянных ссылок (404 на сообщения). Затем, когда сайт загружается (перехват инициализации процесса), структура постоянных ссылок снова меняется (снова 404 на сообщения). Использование $wp_rewrite->flush_rules();решает проблему. Плохая практика - использовать его в init и запускать каждый раз. Просто посещение страницы с постоянными ссылками поможет вам.
Сисир

1
Все намерение состояло в том, чтобы отключить страницу параметров постоянных ссылок, так что, возможно, я смогу сойти с рук?
Томас Бутелер

3
Он должен вызываться в after_switch_theme или при активации плагина, после чего следует flush_rewrite_rules ()
csstd

2

Предыдущий ответ не работает. Я получил чистое решение. Можно использовать Используйте этот код. Это будет работать на 100%. Спасибо

/**
 * 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' );

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();
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.