Code WooCommerce WordPress

Si të Kufizoni Aksesin në Faqe bazuar në Produktet e Blera në WooCommerce

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:

  1. Kontrollon nëse përdoruesi është i loguar.
  2. Nëse është loguar, verifikon nëse përdoruesi ka blerë produktin e kërkuar për faqen që po përpiqet të aksesojë.
  3. Nëse nuk e ka blerë produktin, ridrejtoje në faqen e produktit.
  4. 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:

  1. Identifikohuni në panelin tuaj të WordPress-it.
  2. Navigoni te Appearance > Theme File Editor.
  3. Në listën e skedarëve në të djathtë, gjeni dhe klikoni mbi functions.php nën temën tuaj aktive.
  4. Vendosni kodin e dhënë në fund të skedarit.
  5. 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ë:

  1. 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).
  2. 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.
  3. Krijoni një dosje për shtojcën tuaj të personalizuar (p.sh., sajdoko-restrict-access) dhe shtoni një skedar .php brenda saj.
  4. 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
        */
    
  5. 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ë.

Chat on WhatsApp Chat on WhatsApp