sd shadow-docs
GitHub
shadow-docs / WordPress / WooCommerce endpointi

WooCommerce My Account endpointi

Lai kontā ("Mans konts") pievienotu pilnīgi jaunu cilni — piem. "Mans abonements" — nepieciešami trīs saskaņoti elementi: URL endpoints, izvēlnes ieraksts un funkcija, kas renderē satura daļu.

1. Reģistrē endpointu ar add_rewrite_endpoint

Šis pasaka WordPress, ka URL /mans-konts/abonements/ ir derīgs — bez tā WordPress to uzskatītu par 404.

add_action( 'init', function() {
	add_rewrite_endpoint( 'abonements', EP_ROOT | EP_PAGES );
});
Pēc pievienošanas jāpārsaglabā permalinki
add_rewrite_endpoint reģistrē endpointu tikai atmiņā katrā pieprasījumā — pašus rewrite noteikumus WordPress kešo datubāzē. Pēc pirmās izvietošanas jāatver Iestatījumi → Pastāvīgās saites un jānospiež "Saglabāt" (vai jāizsauc flush_rewrite_rules() vienreiz), citādi endpoints turpina rādīt 404.

2. Pievieno cilni izvēlnē ar woocommerce_account_menu_items

Šis filtrs saņem sakārtotu masīvu ['dashboard' => 'Panelis', 'orders' => 'Pasūtījumi', ...]. Lai ievietotu jaunu cilni konkrētā vietā (nevis tikai galā), masīvu jāveido no jauna:

add_filter('woocommerce_account_menu_items', function($items) {
	unset($items['downloads']); // paslēpj noklusējuma cilni

	// Ievieto "Mans abonements" tieši pēc "Panelis"
	$new = [];
	foreach ($items as $key => $label) {
		$new[$key] = $label;
		if ($key === 'dashboard') {
			$new['abonements'] = 'Mans abonements';
		}
	}
	return $new;
});

3. Renderē satura daļu ar woocommerce_account_{endpoint}_endpoint

WooCommerce automātiski izsauc hooku woocommerce_account_<endpoint-nosaukums>_endpoint, kad lietotājs atver šo URL. Nosaukumā jāsakrīt tieši ar to, ko reģistrēji 1. solī:

add_action('woocommerce_account_abonements_endpoint', function() {
	$user_id = get_current_user_id();
	$sub_end = get_user_meta($user_id, 'subscription_end', true);

	$now    = time();
	$active = $sub_end && $sub_end > $now;
	?>
	<h3>Abonements</h3>
	<table class="woocommerce-table shop_table">
		<tr>
			<th>Statuss</th>
			<td><?php echo $active ? '✅ Aktīvs' : '❌ Neaktīvs'; ?></td>
		</tr>
		<?php if ($sub_end): ?>
		<tr>
			<th>Beidzas</th>
			<td><?php echo date('d.m.Y H:i', $sub_end); ?></td>
		</tr>
		<?php endif; ?>
	</table>
	<?php
});
Vienmēr esc_html() lietotāja datiem
Piemērā virs šī $sub_end nāk no get_user_meta un tiek formatēts ar date(), tāpēc tas ir droši izvadāms tiešā veidā. Bet dati, kas var saturēt brīvu tekstu (piem. maksājumu vēsture ar summām/statusiem, ko kāds varētu ievadīt caur formu), pirms izvades vienmēr jāapstrādā ar esc_html() — tā tas ir darīts pilnajā "Maksājumu vēsture" tabulā oriģinālajā tēmā.

Pilns, palaižams piemērs

Trīs daļas kopā — reāli strādā jaunā plugin failā vai functions.php, ja WooCommerce ir aktivizēts:

<?php
// 1. Endpoint reģistrācija
add_action( 'init', function() {
	add_rewrite_endpoint( 'lojalitate', EP_ROOT | EP_PAGES );
});

// 2. Izvēlnes ieraksts
add_filter( 'woocommerce_account_menu_items', function( $items ) {
	$new = [];
	foreach ( $items as $key => $label ) {
		$new[$key] = $label;
		if ( $key === 'dashboard' ) {
			$new['lojalitate'] = 'Lojalitātes punkti';
		}
	}
	return $new;
});

// 3. Satura renderēšana
add_action( 'woocommerce_account_lojalitate_endpoint', function() {
	$points = get_user_meta( get_current_user_id(), 'loyalty_points', true ) ?: 0;
	echo '<h3>Lojalitātes punkti</h3>';
	echo '<p>Tev ir <strong>' . esc_html( $points ) . '</strong> punkti.</p>';
});

Pēc ielīmēšanas: atver Iestatījumi → Pastāvīgās saites → Saglabāt izmaiņas (lai reģistrētu rewrite noteikumu), tad atver "Mans konts" — jaunā cilne būs redzama.