web-dev-qa-db-ja.com

do_action()をload-(ページ)にフォークする

すべての設定をwp_optionsに保存する管理テーマ設定ページを作成しました。今度は、このテーマに必要な設定に応じて有効化および無効化できるプラグインによってこの設定ページを拡張します。たとえば、国ごとに異なる支払プロバイダです。

私の設定ページのオプションフィールドは、一般、支払い、測定など、タブごとに並べられています。

それで私は3つのことをフック可能にしなければなりません:

  1. タブ
  2. タブの内容
  3. タブコンテンツの保存

最初の2(タブとタブコンテンツ)は成功しますが、タブコンテンツの保存は成功しません。これは load-(page) アクションフックにフックしたからだと思います。私はあらゆることをテストしましたが、なぜこのコンテンツが保存されないのか見つけることができません。

管理者init:

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

管理者設定ページを作成し、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' );

データ送信後に右タブページを読み込む:

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; 
    }
}

設定の保存+アクションフック:

この部分の下部には、タブの内容をさらに保存するためにdo_action()関数を挿入したことがわかります。

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 );    
}

私のプラグインファイルのsave add_actionフック

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 );
1
Robbert

私はapply_filter()のdo_action()を変更しました。これは次のように機能しました。

// Filter save settings
$settings = apply_filters( 'gtp_theme_settings_tab_save', $settings, $tab, $_POST );
$updated = update_option( 'gtp_theme_settings', $settings );  

それからプラグインファイルの私のadd_filterはこのようになります:

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 );
0
Robbert