Nastavení vlastního typu produktu v administraci - Affinite.io CZ

Pro plugin který jsem pracovně pojmenovat EventPress budeme potřebovat přidat nějaké nastavení, které nám umožní přidat vlastní funkce.

Jako základ si připravíme registraci na online webinář a nebudeme dělat nic složitého, takže přidáme následující pole:

  • maximální počet účastníků
  • minimální počet účastníků (minimum pro pořádání)
  • datum a čas konání

Nic jiného potřebovat nebudeme

Do funkce musilda_eventpress_product_option si přidáme následující kód:

global $post;
$min_participants = get_post_meta( $post->ID, '_min_participants', true );
if ( empty( $min_participants ) ) {
	$min_participants = 1;
}
$max_participants = get_post_meta( $post->ID, '_max_participants', true );
if ( empty( $max_participants ) ) {
	$max_participants = 1;
}

woocommerce_wp_text_input(
	array(
		'id'                => '_min_participants',
		'value'             => $min_participants,
		'label'             => __( 'Minimal participants', 'musilda-eventpress' ),
		'placeholder'       => __( '1', 'musilda-eventpress' ),
		'description'       => __( 'Add minimum participants for event', 'musilda-eventpress' ),
		'type'              => 'number',
		'custom_attributes' => array(
			'step' => '1',
			'min'  => '1',
		),
	)
);
woocommerce_wp_text_input(
	array(
		'id'                => '_max_participants',
		'value'             => $max_participants,
		'label'             => __( 'Maximal participants', 'musilda-eventpress' ),
		'placeholder'       => __( '1', 'musilda-eventpress' ),
		'description'       => __( 'Add maximal participants for event', 'musilda-eventpress' ),
		'type'              => 'number',
		'custom_attributes' => array(
			'step' => '1',
			'min'  => '1',
		),
	)
);

Výsledek:

To bylo to jednodušší, protože jsme využili funkci woocommerce_wp_text_input a vygenerovali si políčka.

Teď ale musíme přidat pole pro přidání výběru data a času konání. WordPress sice v sobě má jQuery a tak lze použít jQuery modul dat pickup, ale já se poslední dobou jQuery snažím vyhýbat, takže použiji https://bulma-calendar.onrender.com/

Abych mohl knihovnu použít, musím nejprve soubory uložit v pluginu a načíst pomocí enqueue:

/**
 * Add admin assets
 *
 */
add_action( 'admin_enqueue_scripts', 'eventpress_enqueue_admin_styles' );
function eventpress_enqueue_admin_styles() {
	$current_screen = get_current_screen();
	if ( 'product' == $current_screen->id ) {
		wp_enqueue_style( 'bulma-calendar', plugins_url( 'assets/admin/css/bulma-calendar.min.css', __FILE__ ), array(), '1.0' );
	}
}
add_action( 'admin_enqueue_scripts', 'eventpress_enqueue_admin_scripts' );
function eventpress_enqueue_admin_scripts() {
	$current_screen = get_current_screen();
	if ( 'product' == $current_screen->id ) {
		wp_enqueue_script( 'bulma-calendar', plugins_url( 'assets/admin/js/bulma-calendar.min.js', __FILE__ ), array(), '1.0', true );

                wp_enqueue_script( 'event-admin', plugins_url( 'assets/admin/js/main.js', __FILE__ ), array(), '1.0', true );
	}
}

Do funkce musilda_eventpress_product_option si za max participants input vložíme následující kód pro input date pickeru:

$event_start_date_time = get_post_meta( $post->ID, '_event_start_date_time', true );
if ( empty( $event_start_date_time ) ) {
	$event_start_date_time = '';
}

echo '<p class="form-field event_start_date_time">
	<label for="event_start_date_time">' . esc_html__( 'Event start date time', 'musilda-eventpress' ) . '</label>
	<input type="date" class="short" name="_event_start_date_time" id="event_start_date_time" value="' . esc_attr( $event_start_date_time ) . '"  maxlength="10" />
</p>';

Jako poslední musíme do souboru main.js, který vložíme do složky assets/admin/js, přidáme kód:

var eventStartDatTime = document.querySelector('#event_start_date_time');
if ( eventStartDatTime ) {
	bulmaCalendar.attach( eventStartDatTime, {
		type: 'datetime',
		dateFormat: 'dd.MM.yyyy',
		weekStart: 1
	});
}

Tento kód bude inicializovat datepicker, který bude vyvolán pomocí souborů bulma calendar, které umístíme do složek assets/admin/js a assets/admin/css. Všechny soubory najdete v commitu, který je odkázán na konci článku.

Pokud jste udělali vše, jak jste měli, výsledek bude vypadat takto:

A samotný výběr data a času:

Tím jsme se dostali téměř na konec dnešní části, zbývá nám již jen uložit data, která vyplníme:

add_action( 'woocommerce_process_product_meta', 'musilda_product_fields_save' );
function musilda_product_fields_save( $post_id ){

	//Check autosave
	if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
		return $post_id;
	}

	//Don't update on Quick Edit
	if ( defined('DOING_AJAX') ) {
		return $post_id;
	}

	//Don't update on Quick Edit
	if ( !empty( $_REQUEST['bulk_edit'] ) ) {
		return $post_id;
	}

	if ( !empty( $_POST['_min_participants'] ) ) {
		$_min_participants = sanitize_text_field( $_POST['_min_participants'] );
		update_post_meta( $post_id, '_min_participants', $_min_participants );
	} else {
		delete_post_meta( $post_id, '_min_participants' );
	}
	if ( !empty( $_POST['_max_participants'] ) ) {
		$_max_participants = sanitize_text_field( $_POST['_max_participants'] );
		update_post_meta( $post_id, '_max_participants', $_max_participants );
	} else {
		delete_post_meta( $post_id, '_max_participants' );
	}
	if ( !empty( $_POST['_event_start_date_time'] ) ) {
		$_event_start_date_time = sanitize_text_field( $_POST['_event_start_date_time'] );
		update_post_meta( $post_id, '_event_start_date_time', $_event_start_date_time );
	} else {
		delete_post_meta( $post_id, '_event_start_date_time' );
	}

}

V tuto chvíli máme připravenou část v administraci a v dalším článku zobrazíme uložená data na frontendu.

Aktuální commit najdete zde.

Jak přidat vlastní řazení produktů v e-shopu
Jak přidat vlastní řazení produktů v e-shopu
27 Lis, 2021
Dvě zranitelnosti v populárním pluginu Hide my WP
Dvě zranitelnosti v populárním pluginu Hide my WP
29 Lis, 2021

Looking for something?