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>
This commit is contained in:
root
2025-11-03 21:04:30 -06:00
commit a22573bf0b
24068 changed files with 4993111 additions and 0 deletions

View File

@@ -0,0 +1,453 @@
<?php
// Style ok, code not yet
class ADBC_Clean_DB_List extends WP_List_Table {
private $aDBc_message = "";
private $aDBc_class_message = "updated";
private $aDBc_elements_to_display = array();
private $aDBc_total_elements_to_clean = 0;
/**
* Constructor
*/
function __construct(){
parent::__construct(array(
'singular' => __('Element', 'advanced-database-cleaner'), //singular name of the listed records
'plural' => __('Elements', 'advanced-database-cleaner'), //plural name of the listed records
'ajax' => false //does this table support ajax?
));
$this->aDBc_prepare_elements_to_clean();
$this->aDBc_print_page_content();
}
/** Prepare elements to display */
function aDBc_prepare_elements_to_clean(){
// Test if user wants to delete a scheduled task
if(isset($_POST['aDBc_delete_schedule'])){
//Quick nonce security check!
if(!check_admin_referer('delete_cleanup_schedule_nonce', 'delete_cleanup_schedule_nonce'))
return; //get out if we didn't click the delete link
// We delete the schedule
$aDBc_sanitized_schedule_name = sanitize_html_class($_POST['aDBc_delete_schedule']);
wp_clear_scheduled_hook('aDBc_clean_scheduler', array($aDBc_sanitized_schedule_name));
// We delete the item from database
$aDBc_schedules = get_option('aDBc_clean_schedule');
unset($aDBc_schedules[$aDBc_sanitized_schedule_name]);
update_option('aDBc_clean_schedule', $aDBc_schedules, "no");
$this->aDBc_message = __('The clean-up schedule deleted successfully!', 'advanced-database-cleaner');
}
// Test if user wants to edit keep_last column for an item
if(isset($_POST['aDBc_keep_input'])){
// Security check - verify nonce
if(!check_admin_referer('aDBc_keep_last_nonce', 'aDBc_keep_last_nonce'))
return; //get out if nonce verification fails
$sanitized_keep_input = sanitize_html_class($_POST['aDBc_keep_input']);
$sanitized_item_keep_to_edit = sanitize_html_class($_POST['aDBc_item_keep_to_edit']);
$settings = get_option('aDBc_settings');
if(empty($settings['keep_last'])){
$keep_value = array($sanitized_item_keep_to_edit => intval($sanitized_keep_input));
}else{
$keep_value = $settings['keep_last'];
$keep_value[$sanitized_item_keep_to_edit] = intval($sanitized_keep_input);
}
$settings['keep_last'] = $keep_value;
update_option('aDBc_settings', $settings, "no");
// Test if the items belongs to a scheduled task. If so, show msg differently
$aDBc_schedules = get_option('aDBc_clean_schedule');
$aDBc_schedules = is_array($aDBc_schedules) ? $aDBc_schedules : array();
$msg_keep_last = __("The 'keep last' value saved successfully!", "advanced-database-cleaner");
foreach($aDBc_schedules as $hook_name => $hook_params){
$lits_of_elements = $hook_params['elements_to_clean'];
if(in_array($sanitized_item_keep_to_edit, $lits_of_elements)){
$msg_keep_last = __("The 'keep last' value saved successfully!", "advanced-database-cleaner") . " <span style='color:orange'>" . __("Please keep in mind that this will change the value of 'keep last' of your corresponding scheduled tasks as well!", "advanced-database-cleaner") . "</span>";
break;
}
}
$this->aDBc_message = $msg_keep_last;
}
// Process bulk action if any before preparing elements to clean
$this->process_bulk_action();
// Get all unused elements
$aDBc_unused_elements = aDBc_count_all_elements_to_clean();
$aDBc_new_URI = $_SERVER['REQUEST_URI'];
// Get settings from DB
$settings = get_option('aDBc_settings');
$aDBc_schedules = get_option('aDBc_clean_schedule');
$aDBc_schedules = is_array($aDBc_schedules) ? $aDBc_schedules : array();
foreach($aDBc_unused_elements as $element_type => $element_info){
// Count total unused elements
$this->aDBc_total_elements_to_clean += $element_info['count'];
// If the item is scheduled, show green image, otherwise show grey one. Select also the text to show next green image
$scheduled_img_name = "grey_clock.svg";
$item_scheduled_in = "";
foreach($aDBc_schedules as $hook_name => $hook_params){
$lits_of_elements = $hook_params['elements_to_clean'];
if(in_array ($element_type, $lits_of_elements)){
$scheduled_img_name = "green_clock.svg";
$item_scheduled_in .= "<div class='aDBc-scheduled-in-row'>" . $hook_name . "</div>";
}
}
if(empty($item_scheduled_in)){
$aDBc_scheduled = "<img style='width:17px' alt='-' src='".ADBC_PLUGIN_DIR_PATH . "/images/" . $scheduled_img_name . "'/>";
}else{
$aDBc_scheduled = "<span class='aDBc-tooltips-headers'>
<img class='aDBc-info-image' style='width:17px' alt='-' src='".ADBC_PLUGIN_DIR_PATH . "/images/" . $scheduled_img_name . "'/><span style='width:190px'>" . __('Scheduled in:','advanced-database-cleaner') . $item_scheduled_in . "</span></span>";
}
if($element_info['count'] > 0){
$color = "red";
$aDBc_count = "<font color='$color' style='font-weight:bold'>" . $element_info['count'] . "</font>";
$aDBc_new_URI = add_query_arg('aDBc_view', $element_type, $aDBc_new_URI);
$aDBc_see = "<a href='" . esc_url( $aDBc_new_URI ) . "'><img width='20px' alt='view' src='".ADBC_PLUGIN_DIR_PATH . '/images/see.svg'."'/></a>";
}else{
$aDBc_count = "<font color='#ccc' style='font-weight:bold'>0</font>";
$aDBc_see = "<img width='20px' alt='-' src='".ADBC_PLUGIN_DIR_PATH . '/images/nothing_to_see.svg'."'/>";
}
// Get "keep_last" option. This option is added in ADBC version 3.0, so test if it is not empty before using it
if(empty($settings['keep_last'])){
$keep_number = '0';
}else{
$keep_setting = $settings['keep_last'];
if(empty($keep_setting[$element_type])){
$keep_number = '0';
}else{
$keep_number = $keep_setting[$element_type];
}
}
// If the item can have keep_last, then prepare it, otherwise echo N/A
if($element_type == "revision" ||
$element_type == "auto-draft" ||
$element_type == "trash-posts" ||
$element_type == "moderated-comments" ||
$element_type == "spam-comments" ||
$element_type == "trash-comments" ||
$element_type == "pingbacks" ||
$element_type == "trackbacks"){
$save_button = __('Save','advanced-database-cleaner');
$keep_info = "<span id='aDBc_keep_label_$element_type'>" . $keep_number . " " . __('days','advanced-database-cleaner') . " | </span>" . "<a id='aDBc_edit_keep_$element_type' class='aDBc-keep-link'>" . __("Edit", "advanced-database-cleaner") . "</a>";
$keep_info .= "<form action='' method='post'>
<input type='hidden' name='aDBc_item_keep_to_edit' value='$element_type'>
<input id='aDBc_keep_input_$element_type' class='aDBc-keep-input' name='aDBc_keep_input' value='$keep_number'/>
<input id='aDBc_keep_button_$element_type' class='aDBc-keep-button button-primary' type='submit' value='$save_button' style='display:none'/>
<a id='aDBc_keep_cancel_$element_type' class='aDBc-keep-cancel-link'> " . __('Cancel','advanced-database-cleaner') . "</a>";
$keep_info .= wp_nonce_field('aDBc_keep_last_nonce', 'aDBc_keep_last_nonce', true, false);
$keep_info .= "</form>";
}else{
$keep_info = __('N/A','advanced-database-cleaner') ;
}
if($element_type == "revision"){
}else if($element_type == "revision"){
$keep_info = __('N/A','advanced-database-cleaner') ;
}
array_push($this->aDBc_elements_to_display, array(
'element_to_clean' => "<a href='". $element_info['URL_blog'] ."' target='_blank' class='aDBc-info-icon'>&nbsp;</a>" . $element_info['name'],
'count' => $aDBc_count,
'view' => $aDBc_see,
'scheduled' => $aDBc_scheduled,
'keep' => $keep_info,
'type' => $element_type
)
);
}
// Call WP prepare_items function
$this->prepare_items();
}
/** WP: Get columns */
function get_columns() {
$aDBc_scheduled_toolip = "<span class='aDBc-tooltips-headers'>
<img class='aDBc-info-image' src='". ADBC_PLUGIN_DIR_PATH . '/images/information2.svg' . "'/>
<span>" . __('Indicates if you have selected the item to be cleaned automatically on a scheduled task. A green image indicates that the item is scheduled while a grey image indicated the opposite.','advanced-database-cleaner') ." </span>
</span>";
$aDBc_keep_last_toolip = "<span class='aDBc-tooltips-headers'>
<img class='aDBc-info-image' src='". ADBC_PLUGIN_DIR_PATH . '/images/information2.svg' . "'/>
<span>" . __('Keep the last x days data from being displayed, and therefore from being cleaned. The plugin will always show only data older than the number of days you have specified.','advanced-database-cleaner') ." </span>
</span>";
$columns = array(
'cb' => '<input type="checkbox" />',
'element_to_clean' => __('Elements to clean','advanced-database-cleaner'),
'count' => __('Count','advanced-database-cleaner'),
'view' => __('View','advanced-database-cleaner'),
'scheduled' => __('Scheduled','advanced-database-cleaner') . $aDBc_scheduled_toolip,
'keep' => __('Keep last','advanced-database-cleaner') . $aDBc_keep_last_toolip,
'type' => 'Type'
);
return $columns;
}
/** WP: Prepare items to display */
function prepare_items() {
$columns = $this->get_columns();
$hidden = $this->get_hidden_columns();
$sortable = array();
$this->_column_headers = array($columns, $hidden, $sortable);
$per_page = 50;
$current_page = $this->get_pagenum();
// Prepare sequence of elements to display
$display_data = array_slice($this->aDBc_elements_to_display,(($current_page-1) * $per_page), $per_page);
$this->set_pagination_args( array(
'total_items' => count($this->aDBc_elements_to_display),
'per_page' => $per_page
));
$this->items = $display_data;
}
/** WP: Get columns that should be hidden */
function get_hidden_columns(){
return array('type');
}
/** WP: Column default */
function column_default($item, $column_name){
switch($column_name){
case 'element_to_clean':
case 'count':
case 'view':
case 'scheduled':
case 'keep':
case 'type':
return $item[$column_name];
default:
return print_r($item, true) ; //Show the whole array for troubleshooting purposes
}
}
/** WP: Column cb for check box */
function column_cb($item) {
return sprintf('<input id="checkbox_%s" type="checkbox" name="aDBc_elements_to_process[]" value="%s" />', $item['type'], $item['type']);
}
/** WP: Get bulk actions */
function get_bulk_actions() {
$actions = array(
'clean' => __('Clean','advanced-database-cleaner')
);
return $actions;
}
/** WP: Message to display when no items found */
function no_items() {
_e('Your database is clean!','advanced-database-cleaner');
}
/** WP: Process bulk actions */
public function process_bulk_action() {
// Detect when a bulk action is being triggered.
$action = $this->current_action();
if ( ! $action )
return;
// security check!
check_admin_referer( 'bulk-' . $this->_args['plural'] );
// Check role
if ( ! current_user_can( 'administrator' ) )
wp_die( 'Security check failed!' );
if ( $action == 'clean' ) {
// If the user wants to clean the elements he/she selected
if(isset($_POST['aDBc_elements_to_process'])){
// Create an array containing allowed elements_types to clean for security
$aDBc_allowed_types = array("revision", "auto-draft", "trash-posts", "moderated-comments", "spam-comments", "trash-comments", "pingbacks", "trackbacks", "orphan-postmeta", "orphan-commentmeta", "orphan-relationships", "orphan-usermeta", "orphan-termmeta", "expired-transients");
foreach($_POST['aDBc_elements_to_process'] as $element){
$aDBc_sanitized_element = sanitize_html_class($element);
if(in_array($aDBc_sanitized_element, $aDBc_allowed_types)){
aDBc_clean_all_elements_type($aDBc_sanitized_element);
}
}
// Update the message to show to the user
$this->aDBc_message = __('Selected elements successfully cleaned!', 'advanced-database-cleaner');
}
}
}
/** Print the page content */
function aDBc_print_page_content(){
// Print a message if any
if($this->aDBc_message != ""){
echo '<div id="aDBc_message" class="' . $this->aDBc_class_message . ' notice is-dismissible"><p>' . $this->aDBc_message . '</p></div>';
}
?>
<div class="aDBc-content-max-width">
<div class="aDBc-left-content">
<form id="aDBc_form" action="" method="post">
<?php
// Print the elements to clean
$this->display();
?>
</form>
</div>
<div class="aDBc-right-box">
<div class="aDBc-right-box-content" style="text-align:center">
<?php
if ( $this->aDBc_total_elements_to_clean == 0 ) {
?>
<img width="58px" src="<?php echo ADBC_PLUGIN_DIR_PATH . '/images/db_clean.svg'?>"/>
<div class="aDBc-text-status-db"><?php _e( 'Your database is clean!', 'advanced-database-cleaner' ); ?></div>
<?php
} else {
?>
<img width="55px" src="<?php echo ADBC_PLUGIN_DIR_PATH . '/images/warning.svg'?>"/>
<div class="aDBc-text-status-db">
<b><?php echo $this->aDBc_total_elements_to_clean; ?></b> <?php _e('Element(s) can be cleaned!','advanced-database-cleaner'); ?>
</div>
<?php
}
?>
</div>
<div class="aDBc-right-box-content">
<div style="text-align:center">
<img width="60px" src="<?php echo ADBC_PLUGIN_DIR_PATH . '/images/alarm-clock.svg'?>"/>
<?php
$aDBc_schedules = get_option( 'aDBc_clean_schedule' );
$aDBc_schedules = is_array( $aDBc_schedules ) ? $aDBc_schedules : array();
// Count schedules available
$count_schedules = count( $aDBc_schedules );
echo "<div class='aDBc-schedule-text'><b>" . $count_schedules ."</b> " .__('Cleanup schedule(s) set','advanced-database-cleaner') . "</div>";
?>
</div>
<?php
foreach ( $aDBc_schedules as $hook_name => $hook_params ) {
echo "<div class='aDBc-schedule-hook-box'>";
echo "<b>" . __( 'Name', 'advanced-database-cleaner' ) . "</b> : " . $hook_name;
echo "</br>";
// We convert hook name to a string because the arg maybe only a digit!
$timestamp = wp_next_scheduled( "aDBc_clean_scheduler", array( $hook_name . '' ) );
if($timestamp){
$next_run = get_date_from_gmt(date('Y-m-d H:i:s', (int) $timestamp), 'M j, Y - H:i');
}else{
$next_run = "---";
}
echo "<b>".__('Next run','advanced-database-cleaner') . "</b> : " . $next_run . "</br>";
$repeat = $hook_params['repeat'];
switch($repeat){
case "once" :
$repeat = __('Once','advanced-database-cleaner');
break;
case "hourly" :
$repeat = __('Hourly','advanced-database-cleaner');
break;
case "twicedaily" :
$repeat = __('Twice a day','advanced-database-cleaner');
break;
case "daily" :
$repeat = __('Daily','advanced-database-cleaner');
break;
case "weekly" :
$repeat = __('Weekly','advanced-database-cleaner');
break;
case "monthly" :
$repeat = __('Monthly','advanced-database-cleaner');
break;
}
echo "<b>".__('Frequency','advanced-database-cleaner') . "</b> : " . $repeat . "</br>";
echo "<b>".__('Items to clean','advanced-database-cleaner') . " : </b>" . count($hook_params['elements_to_clean'])."</br>";
echo $hook_params['active'] == "1" ? "<img class='aDBc-schedule-on-off' src='". ADBC_PLUGIN_DIR_PATH . "/images/switch-on.svg" . "'/>" : "<img class='aDBc-schedule-on-off' src='". ADBC_PLUGIN_DIR_PATH . "/images/switch-off.svg" . "'/>";
$aDBc_new_URI = $_SERVER['REQUEST_URI'];
$aDBc_new_URI = add_query_arg('aDBc_view', 'edit_cleanup_schedule', $aDBc_new_URI);
$aDBc_new_URI = add_query_arg('hook_name', $hook_name, $aDBc_new_URI);
?>
<span class="aDBc-edit-delete-schedule">
<a href="<?php echo esc_url( $aDBc_new_URI ) ?>" class="aDBc-edit-schedule-link">
<?php _e( 'Edit', 'advanced-database-cleaner' ); ?>
</a>
|
<form action="" method="post" class="aDBc-delete-schedule-link">
<input type="hidden" name="aDBc_delete_schedule" value="<?php echo $hook_name ?>" />
<input class="aDBc-submit-link" type="submit" value="<?php _e('Delete','advanced-database-cleaner') ?>" />
<?php wp_nonce_field('delete_cleanup_schedule_nonce', 'delete_cleanup_schedule_nonce') ?>
</form>
</span>
</div>
<?php
}
$aDBc_new_URI = $_SERVER['REQUEST_URI'];
$aDBc_new_URI = add_query_arg('aDBc_view', 'add_cleanup_schedule', $aDBc_new_URI);
?>
<a href="<?php echo esc_url( $aDBc_new_URI ) ?>" id="aDBc_add_schedule" class="button-primary aDBc-add-new-schedule">
<?php _e('Add new schedule','advanced-database-cleaner'); ?>
</a>
</div>
</div>
<div class="aDBc-clear-both"></div>
</div>
<?php
}
}
new ADBC_Clean_DB_List();
?>