J'ai créé une page de paramètres de thème d'administrateur sur laquelle je sauvegarde tous mes paramètres dans wp_options. Maintenant, je veux développer cette page de paramètres avec des plugins qui peuvent être activés et désactivés en fonction des paramètres que ce thème doit avoir. Par exemple, différents fournisseurs de paiement par pays.
Les champs d'option de ma page de paramètres sont classés par onglets, par exemple général, paiement, mesure, etc.
Je dois donc rendre 3 choses accrocheables:
Les 2 premiers (Onglets et contenu des onglets) réussissent, mais pas l'enregistrement du contenu des onglets. Je pense que c’est parce que j’accroche dans le crochet d’action load- (page) . J'ai testé toutes sortes de choses, mais je ne trouve pas pourquoi ce contenu n'est pas enregistré.
init Admin:
function gtp_admin_init() {
$settings = get_option( 'gtp_theme_settings' );
if( empty( $settings ) ) {
$settings = array();
add_option( 'gtp_theme_settings', $settings, '', 'yes' );
}
}
add_action( 'init', 'gtp_admin_init' );
Créez une page de paramètres administrateur et chargez la page de paramètres avec gtp_load_settings_page ():
function gtp_settings_page_init() {
$settings_page = add_theme_page( __( 'Theme settings', 'gtp_translate' ), __( 'Theme settings', 'gtp_translate' ), 'edit_theme_options', 'theme-settings', 'gtp_settings_page' );
add_action( 'load-' . $settings_page, 'gtp_load_settings_page' );
}
add_action( 'admin_menu', 'gtp_settings_page_init' );
Charger la page à onglet droite après la soumission des données:
function gtp_load_settings_page() {
if( isset( $_POST['submit'] ) ) {
check_admin_referer( 'gtp-settings-page' );
gtp_save_theme_settings();
$url_parameters = isset( $_GET['tab'] ) ? 'updated=true&tab=' . $_GET['tab'] : 'updated=true';
wp_redirect( admin_url( 'themes.php?page=theme-settings&' . $url_parameters ) );
exit;
}
}
Enregistrer les paramètres + l'action hook:
Au bas de cette partie, vous voyez que j'ai inséré la fonction do_action () pour une sauvegarde supplémentaire du contenu de l'onglet.
function gtp_save_theme_settings() {
global $pagenow;
// Get settings from options table
$settings = get_option( 'gtp_theme_settings' );
// Check which tab is active
if( $pagenow == 'themes.php' && $_GET['page'] == 'theme-settings' ) {
if( isset( $_GET['tab'] ) )
$tab = $_GET['tab'];
else
$tab = 'general';
}
// Check which data to save
switch( $tab ) {
case 'general' :
$settings['gtp_contact_redirect'] = $_POST['gtp_contact_redirect'];
$settings['gtp_review_redirect'] = $_POST['gtp_review_redirect'];
break;
case 'payment' :
$settings['gtp_payment_setting'] = $_POST['gtp_payment_setting'];
break;
}
// Hook save settings
do_action( 'gtp_theme_settings_tab_save', $tab, $settings, $_POST );
$updated = update_option( 'gtp_theme_settings', $settings );
}
Le crochet de sauvegarde add_action dans mon fichier de plugin
function ac_theme_settings_tab_save( $tab, $settings, $postdata ) {
if( $tab == 'adcalls' ) {
$settings['gtp_adcalls_domain_id'] = $postdata['gtp_adcalls_domain_id'];
}
}
add_action( 'gtp_theme_settings_tab_save', 'ac_theme_settings_tab_save', 10, 3 );
J'ai changé le do_action () pour un apply_filter (). Cela a fonctionné comme suit:
// Filter save settings
$settings = apply_filters( 'gtp_theme_settings_tab_save', $settings, $tab, $_POST );
$updated = update_option( 'gtp_theme_settings', $settings );
Et puis mon add_filter dans le fichier plugin ressemble à ceci:
function ac_theme_settings_tab_save( $settings, $tab, $postdata ) {
if( $tab == 'adcalls' ) {
$settings['gtp_adcalls_domain_id'] = $postdata['gtp_adcalls_domain_id'];
}
return $settings;
}
add_filter( 'gtp_theme_settings_tab_save', 'ac_theme_settings_tab_save', 10, 3 );