我有一个子域多站点网络。为了以编程方式创建新的子域,我实现了一个系统,只需填写一个表单。
现在我有一个需求:创建新博客时,我想将其永久链接结构设置为/postname/。
我尝试过以下解决方案:
How to set permalink structure via functions.php
function set_default_permalink_for_new_blogs($blog_id)
{
global $wp_rewrite;
$wp_rewrite->set_permalink_structure( \'/%year%/%monthnum%/%postname%/\' );
}
add_action(\'wpmu_activate_blog\', \'set_default_permalink_for_new_blogs\');
我在函数中添加了这个片段。php的主题用于主站点,上面提到的系统就在这里。这根本不起作用。
How Do I Programmatically Force Custom Permalinks with My Theme?
function change_permalinks() {
global $wp_rewrite;
$wp_rewrite->set_permalink_structure(\'/%postname%/\');
$wp_rewrite->flush_rules();
}
add_action(\'init\', \'change_permalinks\');
我对这段代码有一些担忧:我不认为对每个“init”都进行重写是个好主意(还有人在评论中对此表示怀疑);其次,这个片段必须放在新博客的默认主题上——但是如果我想在将来更改默认主题呢?
非常感谢您的建议,
马可
最合适的回答,由SO网友:José Machado 整理而成
有了“mu插件”,解决方案是。。。
add_action( \'wpmu_new_blog\', function( $blog_id ){
switch_to_blog( $blog_id );
global $wp_rewrite;
$wp_rewrite->set_permalink_structure(\'/%postname%/\');
$wp_rewrite->flush_rules();
restore_current_blog();
}, 10 );
SO网友:WebElaine
您应该能够创建一个在activate_blog
钩像这样的事情应该会让你朝着正确的方向开始:
<?php
/* Plugin name: WPSE Permalink Setter
Description: Sets permalink structure for each blog activation
*/
add_action(\'activate_blog\', \'wpse_271662_set_permalinks\');
function wpse_271662_set_permalinks() {
global $wp_rewrite;
$wp_rewrite->set_permalink_structure(\'/%postname%/\');
$wp_rewrite->flush_rules();
}
?>
因为代码仅在创建新站点时运行(
activate_blog
), 这可以防止与在每个
init
, 而且它不依赖于主题。当然,从理论上讲,站点管理员可以稍后更改permalink结构,但这将为他们提供一个干净的permalink结构安装,除非他们胡闹。
将此文件直接放在内部/wp-content/mu-plugins/
(没有像普通插件那样的子文件夹),因此除非删除文件,否则它将自动运行。