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 );
});
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
});
esc_html() lietotāja datiem$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.