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.
Foarte tare, merci de share. Chiar cautam asa ceva…