Reguli custom pentru Discount Rules (Flycart)

Reguli custom pentru Discount Rules (Flycart)

Dacă tot am un site pe Woo Commerce pe mână, o să mai scriu despre asta :) Am rămas până la urmă la pluginul ăsta pentru aplicarea discount-ului în funcție de… diverse condiții.

Pluginul e mișto, varianta gratuită este… ok-ish, varianta pro are funcționalități bune, dar nu făcea ce aveam eu nevoie: acordarea unui discount în funcție de o acțiune anterioară. Pentru că documentația care există este cam zero, a rezultat postul ăsta.

Doar ca plugin

Prima regulă este că regulile astea nu merg dacă sunt incluse în temă, este nevoie să fie făcut un plugin. Din fericire, ăsta e un proces extrem de simplu și nu am de gând să intru în detalii. Dar sa zicem că pluginul nostru este în wp-content/plugins/regulile-noastre-toate/index.php. În pluginul ăsta înregistrăm condiția.

Înregistrarea condiției

add_filter('advanced_woo_discount_rules_conditions', 'inregistre_conditii', 10, 1);

add_action('advanced_woo_discount_rules_loaded', function () {
    add_filter('advanced_woo_discount_rules_conditions', 'inregistre_conditii', 10, 1);
});

Habar n-am de ce este nevoie de două ori, dar.. sunt tot felul de edge-case-uri dubioase.

function inregistre_conditii($conditions)
{
    require_once 'includes/RegulileNoastreToate.php';

    $regula = new RegulileNoastreToate();

    $conditions[$regula->name()] = [
        'object' => $regula,
        'label' => $regula->label,
        'group' => $regula->group,
        'template' => $regula->template,
        'extra_params' => $regula->extra_params,
    ];

    return $conditions;
}

Pentru că polimorfismul este ceva abstract pentru ei, înregistrăm tot cârnatul ăsta. În fine…

Condiția

Clasa condițională este formată din două părți: clasa propriu zisă și un view pentru admin.

use Wdr\App\Conditions\Base;

class RegulileNoastreToate  extends Base
{
    public function __construct()
    {
        parent::__construct();
        $this->name = 'regulile_noastre_toate';
        $this->label = __('Regula noastră');
        $this->group = __('Customer');
        $this->template = preg_replace('~\/~', DIRECTORY_SEPARATOR, dirname(__FILE__) . '/views/regulile-noastre-toate.php');
    }

    function check($cart, $options)
    {
        if (empty($cart) || !isset($options->operator, $options->value)) {
            return false;
        }
        // aici pui verificările necesare
        return get_user_meta(get_current_user_id(), 'merită-discount', true);
    }
}

Dead simple, nu? Și un view la fel de simplu, trebuie să avem grijă la câteva clase HTML:

<?php

use Wdr\App\Controllers\Admin\Settings;

if (!defined('ABSPATH')) {
    exit; // Exit if accessed directly
}
$settings = new Settings();

$operator = $options->operator ?? 'active';
$value = $options->value ?? '';

echo ($render_saved_condition == true) ? '' : '<div class="regulile_noastre_toate">';
?>
<div class="wdr_regulile_noastre_toate_group wdr-condition-type-options">
    <div class="wdr-select-filed-hight" style="vertical-align: top">
        <select name="conditions[<?php echo (isset($i)) ? $i : '{i}' ?>][options][operator]" class="awdr-left-align">
            <option value="active" <?php echo ($operator == "active") ? "selected" : ""; ?>><?php _e('Active') ?></option>
            <option value="inactive" <?php echo ($operator == "not_active") ? "selected" : ""; ?>><?php _e('Not Active') ?></option>
        </select>
    </div>

    <div class="wdr-select-filed-hight" style="vertical-align: top">
        <select name="conditions[<?php echo (isset($i)) ? $i : '{i}' ?>][options][value]">
            <option value="">-------------------</option>
            <?php foreach (['conditie1', 'conditie2'] as $conditie) : ?>
                <option value="<?= $conditie; ?>"
                    <?= $conditie == $value ? ' selected ' : ''; ?>>
                    <?= $conditie ?>
                </option>
            <?php endforeach; ?>
        </select>
    </div>
</div>
<?php echo ($render_saved_condition == true) ? '' : '</div>'; ?>

La opțiunile din foreach: ține cont că acest view este încărcat doar în pagina de admin a plugin-ului de fiecare dată. Asta înseamnă că, în funcție de cum generezi opțiunile, s-ar putea să ai timp de încărcare ceva mai mare în admin.


În altă ordine de idei: cred că cea mai bună șmecherie făcută în 2019 a fost că am schimbat editorul și am trecut pe IDE. Voi dezvolta cu o altă ocazie, dar a fost game changer.

Un Comentariu

Adaugă un comentariurăspuns pentru

Poți adăuga bucăți de cod folosind [code]codul tău aici[/code], [js][/js], [php][/php] etc.

Link-urile în context sunt binevenite. Comentariile fără nume/email valid sunt șterse.
PS: Comentariul NU este editabil.

Acest sit folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.

Site-ul blog.iamntz.com utilizează cookie-uri. Continuarea navigării presupune acceptarea lor. Mai multe informații.

windows apple dropbox facebook twitter