Nëse po menaxhoni një dyqan WooCommerce, mund të dëshironi të kufizoni aksesin në disa faqe bazuar në produktet që ka blerë një përdorues. Për shembull, mund të ofroni përmbajtje ose shërbime ekskluzive për klientët që kanë blerë produkte specifike. Ky tutorial do t’ju udhëzojë përmes procesit të kufizimit të aksesit në faqe bazuar në historinë e blerjeve të një përdoruesi duke përdorur WooCommerce dhe pak kod të personalizuar.
Udhëzues Hap Pas Hapi
1. Përmbledhje e Kodit
Kodi më poshtë bën dy gjëra kryesore:
- Kontrollon nëse një përdorues është i loguar dhe ka blerë produktin e kërkuar. Nëse jo, ata ridrejtohen në faqen e hyrjes ose në faqen e produktit.
- Shton një lidhje në panelin e llogarisë WooCommerce të përdoruesit që tregon se cilat faqe mund të aksesojnë bazuar në blerjet e tyre.
2. Kufizimi i Aksesit në Faqe bazuar në Blerjet e Produkteve
Së pari, ne duhet të kufizojmë aksesin në faqe të caktuara në varësi të faktit nëse përdoruesi ka blerë një produkt. Nëse nuk e ka blerë, do të ridrejtohen ose në faqen e hyrjes (nëse nuk është loguar) ose në faqen e produktit (nëse nuk e ka blerë produktin).
/**
* Kontrolloni nëse përdoruesi është i loguar dhe ka blerë produktin. Nëse jo, ridrejtoni në faqen e hyrjes.
*/
function sajdoko_to_login_if_not_customer() {
global $post;
// Merrni ID-në e përdoruesit aktual dhe objektin e përdoruesit
$user_id = get_current_user_id();
$current_user = wp_get_current_user();
$customer_email = $current_user->user_email;
// Përputhja e faqeve të kufizuara me ID-të e produkteve përkatëse
$relation_page_product = [1439 => 1211, 1431 => 1210, 1441 => 1214, 1440 => 1212]; //page => product
// Kontrolloni nëse faqja aktuale është një nga faqet e kufizuara
if (isset($relation_page_product[$post->ID])) {
// Nëse përdoruesi është i loguar, kontrolloni nëse ka blerë produktin
if (is_user_logged_in()) {
// Nëse përdoruesi nuk ka blerë produktin, ridrejtoni në faqen e produktit
if (!wc_customer_bought_product_paid($customer_email, $user_id, $relation_page_product[$post->ID])) {
wp_redirect(esc_url(get_permalink($relation_page_product[$post->ID])));
exit;
}
} else {
// Nëse përdoruesi nuk është i loguar, ridrejtoni në faqen e hyrjes
wp_redirect(esc_url(wp_login_url()), 307);
exit;
}
}
}
add_action('wp', 'sajdoko_to_login_if_not_customer');
Ky kod funksionon në mënyrën si vijon:
- Kontrollon nëse përdoruesi është i loguar.
- Nëse është loguar, verifikon nëse përdoruesi ka blerë produktin e kërkuar për faqen që po përpiqet të aksesojë.
- Nëse nuk e ka blerë produktin, ridrejtoje në faqen e produktit.
- Nëse nuk është loguar, përdoruesi ridrejtohet në faqen e hyrjes.
3. Shfaqja e Faqeve të Aksesueshme në Panelin e Përdoruesit
Më pas, do t’u tregojmë përdoruesve lidhjet me faqet që mund të aksesojnë bazuar në produktet që ka blerë. Kjo bëhet duke shtuar një listë të faqeve të aksesueshme në panelin e llogarisë WooCommerce të përdoruesit.
function sajdoko_show_link_page_to_dashboard() {
// Merrni ID-në dhe objektin e përdoruesit aktual
$user_id = get_current_user_id();
$current_user = wp_get_current_user();
$customer_email = $current_user->user_email;
// Përputhja e ID-ve të produkteve me ID-të e faqeve përkatëse
$relation_product_page = [1211 => 1439, 1210 => 1431, 1214 => 1441, 1212 => 1440]; //product => page
// Merrni listën e produkteve të blera nga përdoruesi
$bought_products = sajdoko_get_bought_products();
// Nëse përdoruesi ka blerë produkte, tregoji ato
if (!empty($bought_products)) {
echo '<h3>' . sprintf(__('Paketat aktive: %s', 'woocommerce'), count($bought_products)) . '</h3>';
echo '<ul>';
foreach ($bought_products as $product_id) {
// Kontrolloni nëse përdoruesi ka blerë dhe paguar produktin
if (wc_customer_bought_product_paid($customer_email, $user_id, $product_id)) {
$page_id = $relation_product_page[$product_id] ?? null;
if ($page_id) {
$link = esc_url(get_permalink($page_id));
echo "<li><a href=\"$link\">" . get_the_title($page_id) . "</a></li>";
}
}
}
echo '</ul>';
}
}
add_action('woocommerce_account_dashboard', 'sajdoko_show_link_page_to_dashboard', 10);
Ky funksion bën këto:
- Merr listën e produkteve që përdoruesi ka blerë.
- Vendos secilin produkt me faqen përkatëse.
- Shfaq lidhje për këto faqe në panelin e llogarisë WooCommerce të përdoruesit.
4. Funksione Ndihmëse
Dy funksionet ndihmëse më poshtë menaxhojnë kontrollin nëse përdoruesi ka blerë dhe paguar për një produkt dhe marrjen e listës së produkteve të blera.
Kontrolli nëse Produkti është Blerë dhe Paguar
/**
* Kontrolloni nëse produkti është blerë dhe paguar.
*/
function wc_customer_bought_product_paid($customer_email, $user_id, $product_id) {
global $wpdb;
// Aplikoni filtrat për të kontrolluar nëse produkti është blerë
$result = apply_filters('woocommerce_pre_customer_bought_product', null, $customer_email, $user_id, $product_id);
if (null !== $result) {
return $result;
}
// Gjeneroni një emër për ruajtjen e rezultatit në cache
$transient_name = 'wc_cbp_' . md5($customer_email . $user_id . WC_Cache_Helper::get_transient_version('orders'));
// Kontrolloni nëse rezultati është në cache
if (false === ($result = get_transient($transient_name))) {
$customer_data = array_filter(array_unique([$user_id, $customer_email]));
// Pastroni dhe filtroni të dhënat e klientit
$customer_data = array_map('esc_sql', $customer_data);
$statuses = array_map('esc_sql', wc_get_is_paid_statuses());
// Nëse nuk ka të dhëna klienti, kthe false
if (empty($customer_data)) {
return false;
}
// Query për të kontrolluar nëse produkti është blerë dhe paguar
$result = $wpdb->get_col("
SELECT im.meta_value FROM {$wpdb->posts} AS p
INNER JOIN {$wpdb->postmeta} AS pm ON p.ID = pm.post_id
INNER JOIN {$wpdb->prefix}woocommerce_order_items AS i ON p.ID = i.order_id
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS im ON i.order_item_id = im.order_item_id
WHERE p.post_status IN ('wc-" . implode("','wc-", $statuses) . "')
AND pm.meta_key IN ('_billing_email', '_customer_user')
AND im.meta_key IN ('_product_id', '_variation_id')
AND im.meta_value != 0
AND pm.meta_value IN ('" . implode("','", $customer_data) . "')
");
$result = array_map('absint', $result);
// Ruajeni rezultatin në cache
set_transient($transient_name, $result, DAY_IN_SECONDS * 30);
}
return in_array(absint($product_id), $result);
}
Marrja e Listës së Produkteve të Blera
function sajdoko_get_bought_products() {
// Merrni objektin e përdoruesit aktual
$current_user = wp_get_current_user();
// Kontrolloni nëse përdoruesi është i vlefshëm
if (0 == $current_user->ID) {
return [];
}
// Krijoni argumentet për kërkimin e porosive
$args = [
'numberposts' => -1,
'meta_key' => '_customer_user',
'meta_value' => $current_user->ID,
'post_type' => wc_get_order_types(),
'post_status' => array_keys(wc_get_is_paid_statuses()),
];
// Merrni listën e porosive të klientit
$customer_orders = get_posts($args);
// Nëse nuk gjenden porosi, kthe një varg bosh
if (!$customer_orders) {
return [];
}
// Kaloni nëpër porositë dhe mblidhni ID-të e produkteve
$product_ids = [];
foreach ($customer_orders as $customer_order) {
$order = wc_get_order($customer_order->ID);
foreach ($order->get_items() as $item) {
$product_ids[] = $item->get_product_id();
}
}
return $product_ids;
}
Si ta Vendosni Këtë Kod në Faqen Tuaj Ekzistuese
Për të shtuar këtë funksionalitet në faqen tuaj WooCommerce, ndiqni hapat më poshtë:
1. Shtoni Kodin në Skedarin functions.php
të Temës Suaj
Mënyra më e lehtë për të shtuar këtë kod të personalizuar është duke e vendosur atë brenda skedarit functions.php
të temës suaj. Ja si:
- Identifikohuni në panelin tuaj të WordPress-it.
- Navigoni te Appearance > Theme File Editor.
- Në listën e skedarëve në të djathtë, gjeni dhe klikoni mbi
functions.php
nën temën tuaj aktive. - Vendosni kodin e dhënë në fund të skedarit.
- Klikoni Update File për të ruajtur ndryshimet.
Shënim: Sigurohuni që të bëni një kopje të faqes tuaj përpara se të bëni ndonjë ndryshim në skedarët e temës tuaj.
2. Përdorni një Shtojcë të Personalizuar
Nëse preferoni të mos prekni skedarët e temës, krijimi i një shtojce të vogël të personalizuar për këtë funksionalitet është një zgjidhje më modulare. Ja si mund ta bëni këtë:
- Në panelin tuaj të WordPress-it, shkoni te Plugins > Add New dhe klikoni mbi Create a Plugin (ose përdorni një shtojcë si Code Snippets).
- Krijoni një skedar të ri për shtojcën duke naviguar te
wp-content/plugins/
në serverin tuaj duke përdorur një klient FTP ose menaxher të skedarëve. - Krijoni një dosje për shtojcën tuaj të personalizuar (p.sh.,
sajdoko-restrict-access
) dhe shtoni një skedar.php
brenda saj. - Ngjisni kodin në këtë skedar, duke filluar me një header për shtojcën si:
/* Plugin Name: Sajdoko Restrict Access by Product Purchase Përshkrimi: Kufizon aksesin në faqe bazuar në blerjet e produkteve në WooCommerce. Version: 1.0 Autor: Emri juaj */
- Pasi të keni ruajtur skedarin, shkoni përsëri te paneli i WordPress-it dhe aktivizoni shtojcën tuaj të re nën seksionin Plugins.
3. Testoni Funksionalitetin
Pasi të keni zbatuar kodin, testoni duke u identifikuar në faqen tuaj me një llogari përdoruesi që ka dhe nuk ka blerë produktet e kërkuara. Provoni të aksesoni faqet e kufizuara dhe verifikoni që përdoruesit ridrejtohen siç duhet bazuar në statusin e blerjes së tyre. Gjithashtu, kontrolloni panelin e llogarisë WooCommerce të përdoruesit për të siguruar që lidhjet e sakta shfaqen për produktet e blera.
Sigurohuni që të pastroni cache-n e faqes tuaj nëse po përdorni një shtojcë caching për të parë ndryshimet menjëherë.