我想给用户一个选项,在我的插件中更改一个自定义的帖子类型slug。使用此答案,我能够将其硬编码为函数:
Redeclare/Change Slug of a Plugin's Custom Post Type
那么,当用户更新插件选项时,我如何重写它以进行更新呢?我试过这样的方法:
function add_custom_rewrite_rule() {
$slug = get_option(\'change_rewrite_slug\'); // my plugin option
// First, try to load up the rewrite rules. We do this just in case
// the default permalink structure is being used.
if( ($current_rules = get_option(\'rewrite_rules\')) ) {
// Next, iterate through each custom rule adding a new rule
// that replaces \'movies\' with \'films\' and give it a higher
// priority than the existing rule.
foreach($current_rules as $key => $val) {
if(strpos($key, \'my_post_type\') !== false) {
add_rewrite_rule(str_ireplace(\'my_post_type\', $slug, $key), $val, \'top\');
} // end if
} // end foreach
} // end if/else
// ...and we flush the rules
flush_rewrite_rules();
} // end add_custom_rewrite_rule
add_action(\'init\', \'add_custom_rewrite_rule\');
这行不通。我觉得我错过了一个步骤:一旦插件选项被保存,它需要告诉这个函数启动并获得新的slug。或者也许有更好的方法。
此外,一旦它被更改,我需要函数来更新它,获取当前选项,然后根据任何新输入更改slug。
我之所以需要这样做,是因为插件有一种事件的post类型,但我希望人们能够自定义它,这样,slug就可以是“show”或“gig”或他们想要的任何东西,而不是“event”。
更新:我正在使用此类:http://tareq.wedevs.com/2012/06/wordpress-settings-api-php-class/
以下是选项页面代码的一部分:
function flush_settings() {
if( isset( $_REQUEST[\'settings-updated\'] ) )
flush_rewrite_rules();
}
/**
* Returns all the settings fields
*
* @return array settings fields
*/
function get_settings_fields() {
$settings_fields = array(
// Other settings here
\'djgigs_basic_settings\' => array(
array(
\'name\' => \'djgigs_rewrite_slug\',
\'label\' => __( \'Permalink Slug\', \'wedevs\' ),
\'desc\' => __( \'Enter a custom permalink slug. The default is \\\'djgig\\\' but you could change it to \\\'gigs\\\' or \\\'events\\\'. \', \'wedevs\' ),
\'type\' => \'text\',
\'default\' => \'djgig\',
),
)
);
return $settings_fields;
}
不确定这是否是添加flush函数的正确位置,或者类中是否存在使其无法工作的内容。