Woocommerce добавить разделы внутри вкладок

Я делаю небольшой плагин в WooCommerce. В этом плагине я хочу показать раздел в админке так же, как shipping Options, Flat Rate, Free Shipping etc на вкладке «Доставка» на панели инструментов настройки woocommerce. Сначала я создал вкладку из плагина, и внутри этой вкладки я хочу разделы. Для создания вкладки я взял код из этого ссылка на сайт Так что мой код для плагина выглядит так

<?php
/**
* Plugin Name: WooCommerce Settings Tab
* Plugin URI: http://www.wordpress.org
* Description: Woocmmerce settings tab.
* Author: Author Name
* Author URI: http://www.wordpress.org
* Version: 1.0
*
*/

class WC_Settings_Tab {
public static function init() {
add_filter( 'woocommerce_settings_tabs_array', __CLASS__ . '::add_settings_tab', 50 );
add_action( 'woocommerce_settings_tabs_settings_tab_demo', __CLASS__ . '::settings_tab' );
add_action( 'woocommerce_update_options_settings_tab_demo', __CLASS__ . '::update_settings' );
add_action( 'woocommerce_sections',__CLASS__ . '::get_sections');
}

public static function add_settings_tab( $settings_tabs ) {
$settings_tabs['settings_tab_demo'] = __( 'Settings Demo Tab', 'woocommerce-settings-tab-demo' );
return $settings_tabs;
}

public static function settings_tab() {
woocommerce_admin_fields( self::get_settings() );
}

public static function update_settings() {
woocommerce_update_options( self::get_settings() );
}

public function get_sections() {
$sections = array(
'' => __( 'Test Link 1', 'woocommerce' ),
'testlink2' => __( 'Test Link 2', 'woocommerce' ),
);

return apply_filters( 'woocommerce_sections', $sections );
}

public static function get_settings() {

$settings = array(
'section_title' => array(
'name'     => __( 'Section Title', 'woocommerce-settings-tab-demo' ),
'type'     => 'title',
'desc'     => '',
'id'       => 'wc_settings_tab_demo_section_title'
),
'title' => array(
'name' => __( 'Title', 'woocommerce-settings-tab-demo' ),
'type' => 'text',
'desc' => __( 'This is some helper text', 'woocommerce-settings-tab-demo' ),
'id'   => 'wc_settings_tab_demo_title'
),
'description' => array(
'name' => __( 'Description', 'woocommerce-settings-tab-demo' ),
'type' => 'textarea',
'desc' => __( 'This is a paragraph describing the setting. Lorem ipsum yadda yadda yadda. Lorem ipsum yadda yadda yadda. Lorem ipsum yadda yadda yadda. Lorem ipsum yadda yadda yadda.', 'woocommerce-settings-tab-demo' ),
'id'   => 'wc_settings_tab_demo_description'
),
'section_end' => array(
'type' => 'sectionend',
'id' => 'wc_settings_tab_demo_section_end'
)
);

return apply_filters( 'wc_settings_tab_demo_settings', $settings );
}

}

WC_Settings_Tab::init();

Но это не показывает разделы. Так может кто-нибудь подсказать, как добавить разделы на вкладке настроек woocommerce? Любая помощь и предложения будут действительно заметны.

4

Решение

Я пытался ответить на этот вопрос уже 2 раза. У меня есть разделы, работающие в моем плагине, но, как вы обнаружили, это было чудовищно, чтобы работать. Лучший пример — как добавить шлюзы доставки / оплаты … если у вас есть доступ к любому из них. А также это зависит от того, делаете ли вы что-то, что вы хотите, чтобы оно было расширяемым.

В любом случае, поскольку я едва мог понять, какой код использовал, я попытался сжать его до 1 файла, который контролировал все разделы.

Сначала загрузите файл настроек.

add_filter( 'woocommerce_get_settings_pages', 'so_26355697_add_settings_page' );
function so_26355697_add_settings_page( $settings ) {
$settings[] = include( 'wc-plugin-settings.php' );
return $settings;
}

А потом в wc-plugin-settings.php файл (который должен возвращать объект класса) …

class WC_Settings_My_Plugin extends WC_Settings_Page {

/**
* Constructor
*/
public function __construct() {

$this->id    = 'demo_plugin';

add_filter( 'woocommerce_settings_tabs_array', array( $this, 'add_settings_tab' ), 50 );
add_action( 'woocommerce_sections_' . $this->id, array( $this, 'output_sections' ) );
add_action( 'woocommerce_settings_' . $this->id, array( $this, 'output' ) );
add_action( 'woocommerce_settings_save_' . $this->id, array( $this, 'save' ) );

}

/**
* Add plugin options tab
*
* @return array
*/
public function add_settings_tab( $settings_tabs ) {
$settings_tabs[$this->id] = __( 'Settings Demo Tab', 'woocommerce-settings-tab-demo' );
return $settings_tabs;
}

/**
* Get sections
*
* @return array
*/
public function get_sections() {

$sections = array(
'section-0'         => __( 'Plugin Options', 'woocommerce-settings-tab-demo' ),
'section-1'         => __( 'Section 1', 'woocommerce-settings-tab-demo' ),
'section 2'         => __( 'Section 2', 'woocommerce-settings-tab-demo' ),

);

return apply_filters( 'woocommerce_get_sections_' . $this->id, $sections );
}/**
* Get sections
*
* @return array
*/
public function get_settings( $section = null ) {

switch( $section ){

case 'section-0' :
$settings = array(
'section_title' => array(
'name'     => __( 'Main Section Title', 'woocommerce-settings-tab-demo' ),
'type'     => 'title',
'desc'     => '',
'id'       => 'wc_settings_tab_demo_title_section-1'
),
'title' => array(
'name' => __( 'Main Title', 'woocommerce-settings-tab-demo' ),
'type' => 'text',
'desc' => __( 'This is some helper text', 'woocommerce-settings-tab-demo' ),
'id'   => 'wc_settings_tab_demo_title_section-1'
),
'description' => array(
'name' => __( 'Main Description', 'woocommerce-settings-tab-demo' ),
'type' => 'textarea',
'desc' => __( 'This is a paragraph describing the setting. Lorem ipsum yadda yadda yadda. Lorem ipsum yadda yadda yadda. Lorem ipsum yadda yadda yadda. Lorem ipsum yadda yadda yadda.', 'woocommerce-settings-tab-demo' ),
'id'   => 'wc_settings_tab_demo_description_section-1'
),
'section_end' => array(
'type' => 'sectionend',
'id' => 'wc_settings_tab_demo_end-section-1'
)
);

break;
case 'section-1':
$settings = array(
'section_title' => array(
'name'     => __( 'Section One Title', 'woocommerce-settings-tab-demo' ),
'type'     => 'title',
'desc'     => '',
'id'       => 'wc_settings_tab_demo_section_title_section-2'
),
'title' => array(
'name' => __( 'Section One Title', 'woocommerce-settings-tab-demo' ),
'type' => 'text',
'desc' => __( 'This is some helper text', 'woocommerce-settings-tab-demo' ),
'id'   => 'wc_settings_tab_demo_title_section-2'
),
'description' => array(
'name' => __( 'Section One Description', 'woocommerce-settings-tab-demo' ),
'type' => 'textarea',
'desc' => __( 'This is a paragraph describing the setting. Lorem ipsum yadda yadda yadda. Lorem ipsum yadda yadda yadda. Lorem ipsum yadda yadda yadda. Lorem ipsum yadda yadda yadda.', 'woocommerce-settings-tab-demo' ),
'id'   => 'wc_settings_tab_demo_description_section-2'
),
'section_end' => array(
'type' => 'sectionend',
'id' => 'wc_settings_tab_demo_section_end_section-2'
)
);
break;
case 'section-2':
$settings = array(
'section_title' => array(
'name'     => __( 'Section Two Title', 'woocommerce-settings-tab-demo' ),
'type'     => 'title',
'desc'     => '',
'id'       => 'wc_settings_tab_demo_section_title'
),
'title' => array(
'name' => __( 'Section Two Title', 'woocommerce-settings-tab-demo' ),
'type' => 'text',
'desc' => __( 'This is some helper text', 'woocommerce-settings-tab-demo' ),
'id'   => 'wc_settings_tab_demo_title'
),
'description' => array(
'name' => __( 'Section Two Description', 'woocommerce-settings-tab-demo' ),
'type' => 'textarea',
'desc' => __( 'This is a paragraph describing the setting. Lorem ipsum yadda yadda yadda. Lorem ipsum yadda yadda yadda. Lorem ipsum yadda yadda yadda. Lorem ipsum yadda yadda yadda.', 'woocommerce-settings-tab-demo' ),
'id'   => 'wc_settings_tab_demo_description'
),
'section_end' => array(
'type' => 'sectionend',
'id' => 'wc_settings_tab_demo_section_end'
)
);break;

}

return apply_filters( 'wc_settings_tab_demo_settings', $settings, $section );

}

/**
* Output the settings
*/
public function output() {
global $current_section;
$settings = $this->get_settings( $current_section );
WC_Admin_Settings::output_fields( $settings );
}/**
* Save settings
*/
public function save() {
global $current_section;
$settings = $this->get_settings( $current_section );
WC_Admin_Settings::save_fields( $settings );
}

}

return new WC_Settings_My_Plugin();

Как я уже сказал, это не совсем то, как это делает Ву, и даже не то, как я это делаю в своем собственном коде. НО, я думаю, что это самый простой подход. Если вам нужно что-то, что может быть расширено, это не будет уместно, но это также гораздо сложнее написать.

6

Другие решения

Вы должны также активировать функцию инициализации для хорошей игры с WordPress, чтобы это произошло в нужное время. Этот триггер является ‘admin_init’.

add_action( 'admin_init',  '<your func name>');

Так что для вашего использования замените:

WC_Settings_Tab::init();

с

add_action( 'admin_init',  'WC_Settings_Tab::init');

Другой способ использовать триггер admin_init — добавить предоставленную вами функцию в файл woocommerce-admin-init.php, который вы должны поместить в папку вашей темы.

Разница в том, что первое решение работает везде, где вы хотите, чтобы вы могли использовать его в плагинах, а не в теме.

0

По вопросам рекламы [email protected]