Files
roi-theme/wp-content/plugins/ajax-search-pro/src/server/Misc/PriorityGroups.php
root a22573bf0b Commit inicial - WordPress Análisis de Precios Unitarios
- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 21:04:30 -06:00

373 lines
8.8 KiB
PHP
Executable File

<?php
namespace WPDRMS\ASP\Misc;
use WPDRMS\ASP\Patterns\SingletonTrait;
if ( !defined('ABSPATH') ) die('-1');
class PriorityGroups {
use SingletonTrait;
/**
* @var string
*/
private $key = '_asp_priority_groups';
/**
* Array of instances (arrays)
*
* @var array
*/
private $instances;
/**
* Ordering in which the instances can be requested: priority, name
*
* @var string
*/
private $order = 'priority';
/**
* Order by: asc or desc
*
* @var string
*/
private $orderBy = 'desc';
/**
* Default data structure for one priority ruleset
*
* @var array
*/
private $default = array(
'priority' => 100,
'name' => 'Priority group',
'phrase' => '', // phrase that affects the logic
'phrase_logic' => 'disabled', // disabled, exact, any, start, end
'instance' => 0, // search instance ID to affect, default 0 (all)
'logic' => 'and', // logic to connect the rules with
'rules' => array(/*
array(
'name' => 'Rule name',
'field' => 'tax', // 'tax', 'cf', 'title' (disabled for now)
'operator' => 'in', // in, not in, like, not like, elike, =, <>, >, <, >=, <=, BETWEEN
'values' => array(),
'_values' => array() // additional data for the values
)
*/
)
);
/**
* A sample default rule, used in the rule array in a ruleset
*
* @var array
*/
private $default_rule = array(
'name' => 'Rule name',
'field' => 'tax', // 'tax', 'cf', 'title'
'operator' => 'in', // in, not in, like, not like, elike, =, <>, >, <, >=, <=, BETWEEN
'values' => array(),
'_values' => array() // additional data for the values
);
/**
* Get a rule by ID, or all rules
*
* @param bool|int $id
* @param bool|int $force_refresh
* @return array
*/
public function get($id = false, $force_refresh = false): array {
if ( !isset($this->instances) || !is_array($this->instances) || $force_refresh )
$this->load();
if ( $id === false ) {
return $this->instances;
} else {
return $this->instances[$id] ?? array();
}
}
/**
* Get all rules sorted
*
* @param string $order
* @param string $orderby
* @return array
*/
public function getSorted(string $order = 'priority', string $orderby = 'desc'): array {
$inst = $this->get();
if ( !empty($inst) ) {
$this->order = $order;
$this->orderBy = $orderby;
usort($inst, array($this, 'sortInstances'));
}
return $inst;
}
/**
* Get a rule by ID, or all rules
* Includes the taxonomy term labels.
*
* @param bool|int $id
* @param bool|int $force_refresh
* @return array
*/
public function getForDisplay($id = false, $force_refresh = false): array {
$inst = $this->get($id, $force_refresh);
if ( empty($inst) )
return $inst;
if ( $id !== false ) {
// For easier use, put a single instance into an array
$inst = array($inst);
}
/**
* Expected structure:
* $inst = array(
* ...,
* 'values' => array(
* array(
* 'field' => 'tax',
* 'values' => array(
* 'taxonomy_name' => array(1, 2, 3),
* ...
* ),
* array(
* 'field' => 'cf',
* 'values' => array( 'field_name' => array('val1', 'val2') )
* ),
* array(
* 'field' => 'title'
* 'values' => 'value'
* )
* ...
* ),
* ....
* );
*/
foreach ($inst as $ik => $instance) {
foreach ($instance['rules'] as $rk => $rule) {
if ( $rule['field'] == 'tax' ) {
foreach ($rule['values'] as $rfk => $rfv) {
$terms = wpd_get_terms(array(
'taxonomy' => $rfk,
'include' => $rule['values'][$rfk],
'fields' => 'id=>name',
'hide_empty' => false
));
if ( !isset($inst[$ik]['rules'][$rk]['_values']) )
$inst[$ik]['rules'][$rk]['_values'] = array();
if ( !is_wp_error($terms) ) {
$inst[$ik]['rules'][$rk]['_values'][$rfk] = $terms;
} else {
// Something went wrong (taxonomy deleted?)
unset($inst[$ik]['rules'][$rk]['values'][$rfk]);
}
}
}
}
}
return $inst;
}
/**
* JSON and Base64 encoded version of get()
*
* @param bool|int $id
* @param bool|int $force_refresh
* @return string
*/
public function getEncoded($id = false, $force_refresh = false): string {
return base64_encode(json_encode($this->get($id, $force_refresh)));
}
/**
* JSON and Base64 encoded version of getForDisplay()
*
* @param bool|int $id
* @param bool|int $force_refresh
* @return string
*/
public function getForDisplayEncoded($id = false, $force_refresh = false): string {
return base64_encode(json_encode($this->getForDisplay($id, $force_refresh)));
}
/**
* Get the rules count
*
* @param bool $force_refresh
* @return int
*/
public function getCount(bool $force_refresh = false): int {
if ( !isset($this->instances) || !is_array($this->instances) || $force_refresh )
$this->load();
return count($this->instances);
}
/**
* Set all instances by data
*
* @param $data
* @param bool|int $save
*/
public function set($data, $save = true) {
$this->instances = $data;
if ( $save )
$this->save();
}
/**
* JSON and Base64 encoded version of set()
*
* @param $data
* @param bool|int $save
*/
public function setEncoded($data, $save = true) {
$this->set(json_decode(base64_decode($data), true), $save);
}
/**
* Add a group to the instances
*
* @param $data
* @param bool|int $save
*/
public function add($data, $save = true) {
$this->instances[] = $data;
if ( $save )
$this->save();
}
/**
* Load up the instances from the database
*
* @return mixed
*/
public function load() {
$this->instances = get_option($this->key, array());
if ( $this->cleanInstances() ) {
// Something changed, save the new, consistent data
$this->save(false);
}
return $this->instances;
}
/**
* Saves instances to the database
*
* @param bool|int $clean
*/
public function save($clean = true) {
if ( $clean )
$this->cleanInstances();
update_option($this->key, $this->instances);
}
/**
* Used for usort() to sort by key
*
* @param $a
* @param $b
* @return int
*/
public function sortInstances($a, $b): int {
if ( isset($a[$this->order], $b[$this->order]) ) {
if ( $a[$this->order] == $b[$this->order] ) {
return 0;
}
if ( $this->orderBy == 'asc' ) {
return ($a[$this->order] < $b[$this->order]) ? -1 : 1;
} else {
return ($a[$this->order] < $b[$this->order]) ? 1 : -1;
}
} else {
return 0;
}
}
/**
*
*/
public function debug() {}
// ------------------------------------------------------------
// ---------------- PRIVATE --------------------
// ------------------------------------------------------------
/**
* Just calls init
*/
private function __construct() {
$this->init();
}
private function init() {
$this->load();
}
/**
* Performs a cleaning process on group instances
*
* @return bool
*/
private function cleanInstances(): bool {
$changed = false;
foreach ($this->instances as $k => &$v) {
// Merge with the default first
$v = wp_parse_args($v, $this->default);
// Clean up the unwanted keys, if any
$instance_keys = array_keys($this->default);
foreach ($v as $kk => $vv) {
if ( !in_array($kk, $instance_keys) )
unset($this->instances[$k][$kk]);
}
// ..also, the unwanted rule keys, if any
$rule_keys = array_keys($this->default_rule);
foreach ($v['rules'] as $rk => $rule) {
foreach ($rule as $kk => $vv) {
if ( !in_array($kk, $rule_keys) )
unset($this->instances[$k]['rules'][$rk][$kk]);
}
}
// Skip these tests on the front-end and on any ajax request
if ( !wp_doing_ajax() && is_admin() ) {
// Clean up non-existent taxonomies and taxonomy terms
foreach ($v['rules'] as $rk => $rule) {
if ( $rule['field'] == 'tax' ) {
foreach ($rule['values'] as $rtax => $rterms) {
$terms = wpd_get_terms(array(
'taxonomy' => $rtax,
'include' => $rterms,
'fields' => 'ids',
'hide_empty' => false
));
if ( !is_wp_error($terms) ) {
// Some category might got deleted?
if ( count($terms) == 0 ) {
unset($this->instances[$k]['rules'][$rk]['values'][$rtax]);
$changed = true;
} else if ( count($terms) < count($rule['values'][$rtax]) ) {
$v['rules'][$rk]['values'][$rtax] = $terms;
$changed = true;
}
} else {
// Something went wrong (taxonomy deleted?)
unset($this->instances[$k]['rules'][$rk]['values'][$rtax]);
$changed = true;
}
}
}
}
}
}
return $changed;
}
}