ver 1.4.0
This commit is contained in:
409
includes/class-Shortcode.php
Normal file
409
includes/class-Shortcode.php
Normal file
@@ -0,0 +1,409 @@
|
||||
<?php
|
||||
|
||||
class CHECKER_SHORTCODE extends SHEET_DATA_CHECKER_PRO {
|
||||
|
||||
/**
|
||||
* A reference to an instance of this class.
|
||||
*/
|
||||
private static $instance;
|
||||
|
||||
/**
|
||||
* Returns an instance of this class.
|
||||
*/
|
||||
public static function get_instance() {
|
||||
|
||||
return self::$instance;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the plugin by setting filters and administration functions.
|
||||
*/
|
||||
public function __construct() {
|
||||
|
||||
// Load security class
|
||||
require_once SHEET_CHECKER_PRO_PATH . 'includes/class-Security.php';
|
||||
|
||||
add_shortcode('checker', [$this, 'content'] );
|
||||
add_action( 'wp_enqueue_scripts', [$this, 'enqueue'] );
|
||||
|
||||
add_action( 'wp_ajax_checker_public_validation', [$this, 'checker_public_validation'] );
|
||||
add_action( 'wp_ajax_nopriv_checker_public_validation', [$this, 'checker_public_validation'] );
|
||||
|
||||
add_action( 'wp_ajax_checker_load_all_data', [$this, 'checker_load_all_data'] );
|
||||
add_action( 'wp_ajax_nopriv_checker_load_all_data', [$this, 'checker_load_all_data'] );
|
||||
|
||||
}
|
||||
|
||||
public function enqueue() {
|
||||
wp_enqueue_style( 'datatable', 'https://cdn.datatables.net/1.13.7/css/jquery.dataTables.min.css', [], 'all' );
|
||||
wp_enqueue_style( 'checker-pro', SHEET_CHECKER_PRO_URL . 'assets/public.css?ver='.SHEET_CHECKER_PRO_VERSION, [], 'all' );
|
||||
|
||||
wp_enqueue_script( 'datatable', 'https://cdn.datatables.net/1.13.7/js/jquery.dataTables.min.js', ['jquery'], true );
|
||||
wp_enqueue_script( 'checker-pro', SHEET_CHECKER_PRO_URL . 'assets/public.js?ver='.SHEET_CHECKER_PRO_VERSION, ['jquery'], true );
|
||||
}
|
||||
|
||||
public function content ($atts, $content=null) {
|
||||
|
||||
if(!isset($atts['id'])){
|
||||
return;
|
||||
}
|
||||
|
||||
$post_id = $atts['id'];
|
||||
$checker = get_post_meta( $post_id, 'checker', true );
|
||||
$checker = wp_parse_args( $checker, [
|
||||
'link' => '',
|
||||
'description' => '',
|
||||
'card' => [
|
||||
'width' => 500,
|
||||
'background' => '#cccccc',
|
||||
'bg_opacity' => 50,
|
||||
'border_radius' => 1,
|
||||
'box_shadow' => '10px 5px 15px -5px',
|
||||
'box_shadow_color' => '#333333',
|
||||
'title' => '#333333',
|
||||
'title_align' => 'left',
|
||||
'description' => '#333333',
|
||||
'description_align' => 'left',
|
||||
'divider' => '#333333',
|
||||
'divider_width' => 1
|
||||
],
|
||||
'field' => [
|
||||
'label' => 'block',
|
||||
'label-color' => '#333333'
|
||||
],
|
||||
'fields' => [],
|
||||
'search_button' => [
|
||||
'text' => 'Search',
|
||||
'bg_color' => '#cccccc',
|
||||
'text_color' => '#333333',
|
||||
'position' => 'flex-end'
|
||||
],
|
||||
'back_button' => [
|
||||
'text' => 'Back',
|
||||
'bg_color' => '#cccccc',
|
||||
'text_color' => '#333333',
|
||||
'position' => 'flex-start'
|
||||
],
|
||||
'result' => [
|
||||
'display' => 'vertical-tabel',
|
||||
'header' => '#333333',
|
||||
'value' => '#333333',
|
||||
'columns' => [],
|
||||
'border_width' => 1
|
||||
]
|
||||
] );
|
||||
|
||||
$url = $checker['link'];
|
||||
|
||||
$link_format = substr($url, -3);
|
||||
|
||||
// Set the delimiter based on the format
|
||||
$delimiter = $link_format == 'tsv' ? "\t" : ","; // Use tab for TSV, comma for CSV
|
||||
|
||||
if (($handle = fopen($url, "r")) !== false) {
|
||||
$keys = fgetcsv($handle, 0, $delimiter); // Read the first row as keys
|
||||
while (($row = fgetcsv($handle, 0, $delimiter)) !== false) {
|
||||
$data[] = array_combine($keys, $row); // Combine keys with row values and add to the data array
|
||||
}
|
||||
fclose($handle);
|
||||
}
|
||||
$background_color = $checker['card']['background'];
|
||||
if($checker['card']['bg_opacity'] < 100){
|
||||
$background_color = $checker['card']['background'].''.$checker['card']['bg_opacity'];
|
||||
}
|
||||
|
||||
$render = '';
|
||||
$render .= '<div class="dw-checker-container" id="checker-'.$post_id.'">';
|
||||
$render .= '<form class="dw-checker-wrapper dw-checker-form"
|
||||
style="max-width: 100%;
|
||||
background-color: '.$background_color.';
|
||||
width: '.$checker['card']['width'].'px;
|
||||
padding: '.$checker['card']['padding'].'em;
|
||||
border-radius: '.$checker['card']['border_radius'].'em;
|
||||
box-shadow: '.$checker['card']['box_shadow'].' '.$checker['card']['box_shadow_color'].';
|
||||
">';
|
||||
$render .= '<div class="dw-checker-title"
|
||||
style="color: '.$checker['card']['title'].';
|
||||
text-align: '.$checker['card']['title_align'].';"
|
||||
>'.get_the_title($post_id).'</div>';
|
||||
$render .= '<div class="dw-checker-description"
|
||||
style="color: '.$checker['card']['description'].';
|
||||
text-align: '.$checker['card']['description_align'].';"
|
||||
>'.$checker['description'].'</div>';
|
||||
|
||||
$render .= '<hr class="dw-checker-divider"
|
||||
style="border-color: '.$checker['card']['divider'].';
|
||||
border-width: '.$checker['card']['divider_width'].'px;">';
|
||||
|
||||
$render .= '<div class="dw-checker-form-fields">';
|
||||
if(isset($checker['fields']) && !empty($checker['fields'])){
|
||||
foreach($checker['fields'] as $key => $field){
|
||||
if($field['type'] == 'text'){
|
||||
$render .= '<div class="dw-checker-field">
|
||||
<label for="'.$key.'" style="color: '.$checker['field']['label-color'].';display: '.$checker['field']['label'].';">
|
||||
'.$field['label'].'
|
||||
</label>
|
||||
<input name="'.$key.'" placeholder="'.$field['placeholder'].'" class="dw-checker-inputs" data-kolom="'.$field['kolom'].'" required/>
|
||||
</div>';
|
||||
}else{
|
||||
$options = '';
|
||||
$option_array = [];
|
||||
foreach($data as $all_data){
|
||||
foreach($all_data as $_key => $_value){
|
||||
if($_key == $field['kolom'] && !in_array($_value, $option_array)){
|
||||
$option_array[] = $_value;
|
||||
}
|
||||
}
|
||||
}
|
||||
asort($option_array);
|
||||
if(!empty($option_array)){
|
||||
foreach($option_array as $val){
|
||||
$options .= '<option value="'.$val.'">'.$val.'</option>';
|
||||
}
|
||||
}
|
||||
$render .= '<div class="dw-checker-field">
|
||||
<label for="'.$key.'" style="color: '.$checker['field']['label-color'].';display: '.$checker['field']['label'].';">
|
||||
'.$field['kolom'].'
|
||||
</label>
|
||||
<select name="'.$key.'" placeholder="'.$field['placeholder'].'" class="dw-checker-inputs" data-kolom="'.$field['kolom'].'" required>
|
||||
<option value="" disabled selected>-- '.$field['placeholder'].' --</option>
|
||||
'.$options.'
|
||||
</select>
|
||||
</div>';
|
||||
}
|
||||
}
|
||||
}
|
||||
$render .= '</div>';
|
||||
|
||||
$render .= '<hr class="dw-checker-divider"
|
||||
style="border-color: '.$checker['card']['divider'].';
|
||||
border-width: '.$checker['card']['divider_width'].'px;">';
|
||||
|
||||
$render .= '<div class="dw-checker-buttons dw-checker-form-button" style="justify-content: '.$checker['search_button']['position'].'">';
|
||||
$render .= '<button type="submit" data-checker="'.$post_id.'" class="search-button"
|
||||
data-btn-text="'.$checker['search_button']['text'].'"
|
||||
style="background-color: '.$checker['search_button']['bg_color'].';
|
||||
color: '.$checker['search_button']['text_color'].';">
|
||||
'.$checker['search_button']['text'].'
|
||||
</button>';
|
||||
$render .= '</div>';
|
||||
|
||||
$render .= '</form>';
|
||||
|
||||
$render .= '<div class="dw-checker-wrapper dw-checker-result"
|
||||
style="display:none; max-width: 100%;
|
||||
background-color: '.$checker['card']['background'].';
|
||||
width: '.$checker['card']['width'].'px;
|
||||
padding: '.$checker['card']['padding'].'em;
|
||||
border-radius: '.$checker['card']['border_radius'].'em;
|
||||
box-shadow: '.$checker['card']['box_shadow'].' '.$checker['card']['box_shadow_color'].';
|
||||
">';
|
||||
$render .= '<div class="dw-checker-title"
|
||||
style="color: '.$checker['card']['title'].';
|
||||
text-align: '.$checker['card']['title_align'].';"
|
||||
></div>';
|
||||
$render .= '<div class="dw-checker-description"
|
||||
style="color: '.$checker['card']['description'].';
|
||||
text-align: '.$checker['card']['description_align'].';"
|
||||
></div>';
|
||||
|
||||
$render .= '<hr class="dw-checker-divider"
|
||||
style="border-color: '.$checker['card']['divider'].';
|
||||
border-width: '.$checker['card']['divider_width'].'px;">';
|
||||
|
||||
$render .= '<div class="dw-checker-results"></div>';
|
||||
|
||||
$render .= '<hr class="dw-checker-divider"
|
||||
style="border-color: '.$checker['card']['divider'].';
|
||||
border-width: '.$checker['card']['divider_width'].'px;">';
|
||||
|
||||
$render .= '<div class="dw-checker-buttons dw-checker-result-button" style="justify-content: '.$checker['back_button']['position'].'">';
|
||||
$render .= '<button type="button" class="back-button" data-checker='.$post_id.'
|
||||
style="background-color: '.$checker['back_button']['bg_color'].';
|
||||
color: '.$checker['back_button']['text_color'].';">
|
||||
'.$checker['back_button']['text'].'
|
||||
</button>';
|
||||
$render .= '</div>';
|
||||
|
||||
$render .= '</div>';
|
||||
$render .= '</div>';
|
||||
$render .= '<div class="dw-checker-bottom-results"></div>';
|
||||
|
||||
// Pass settings to frontend as data attributes
|
||||
$render .= '<script type="application/json" id="checker-settings-'.$post_id.'" class="checker-settings-data">';
|
||||
$render .= json_encode([
|
||||
'checker_id' => $post_id,
|
||||
'initial_display' => $checker['result']['initial_display'] ?? 'hidden',
|
||||
'filter_mode' => $checker['result']['filter_mode'] ?? 'search',
|
||||
'max_records' => $checker['result']['max_records'] ?? 100,
|
||||
'url_params_enabled' => $checker['url_params']['enabled'] ?? 'no',
|
||||
'url_params_auto_search' => $checker['url_params']['auto_search'] ?? 'no'
|
||||
]);
|
||||
$render .= '</script>';
|
||||
|
||||
return $render;
|
||||
|
||||
}
|
||||
|
||||
public function checker_public_validation() {
|
||||
|
||||
$post_id = $_REQUEST['checker_id'];
|
||||
$checker = get_post_meta( $post_id, 'checker', true );
|
||||
|
||||
// Security checks
|
||||
$ip = CHECKER_SECURITY::get_client_ip();
|
||||
|
||||
// Check rate limit
|
||||
$rate_limit = CHECKER_SECURITY::check_rate_limit($post_id, $ip);
|
||||
if (!$rate_limit['allowed']) {
|
||||
wp_send_json_error([
|
||||
'message' => $rate_limit['message'],
|
||||
'type' => 'rate_limit'
|
||||
]);
|
||||
return;
|
||||
}
|
||||
|
||||
// Check reCAPTCHA if enabled
|
||||
if (isset($_REQUEST['recaptcha_token'])) {
|
||||
$recaptcha = CHECKER_SECURITY::verify_recaptcha($post_id, $_REQUEST['recaptcha_token']);
|
||||
if (!$recaptcha['success']) {
|
||||
wp_send_json_error([
|
||||
'message' => $recaptcha['message'],
|
||||
'type' => 'recaptcha'
|
||||
]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Check Turnstile if enabled
|
||||
if (isset($_REQUEST['turnstile_token'])) {
|
||||
$turnstile = CHECKER_SECURITY::verify_turnstile($post_id, $_REQUEST['turnstile_token']);
|
||||
if (!$turnstile['success']) {
|
||||
wp_send_json_error([
|
||||
'message' => $turnstile['message'],
|
||||
'type' => 'turnstile'
|
||||
]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
$url = $checker['link'];
|
||||
|
||||
$link_format = substr($url, -3);
|
||||
|
||||
// Set the delimiter based on the format
|
||||
$delimiter = $link_format == 'tsv' ? "\t" : ","; // Use tab for TSV, comma for CSV
|
||||
|
||||
if (($handle = fopen($url, "r")) !== false) {
|
||||
$keys = fgetcsv($handle, 0, $delimiter); // Read the first row as keys
|
||||
while (($row = fgetcsv($handle, 0, $delimiter)) !== false) {
|
||||
$data[] = array_combine($keys, $row); // Combine keys with row values and add to the data array
|
||||
}
|
||||
fclose($handle);
|
||||
}
|
||||
|
||||
$validator = $_REQUEST['validate'];
|
||||
$validation = [];
|
||||
foreach($validator as $validate){
|
||||
$validation[$validate['kolom']] = $validate['value'];
|
||||
}
|
||||
$validator_count = count($validator);
|
||||
$result = [];
|
||||
if(!empty($data)){
|
||||
foreach($data as $row){
|
||||
$valid = [];
|
||||
foreach($row as $header => $value){
|
||||
$id = '_'.strtolower(str_replace(' ', '_', $header));
|
||||
$include = false;
|
||||
if(isset($validation[$header])){
|
||||
if($checker['fields'][$id]['match'] == 'match' && strtolower($value) == strtolower($validation[$header])){
|
||||
$include = true;
|
||||
}
|
||||
if($checker['fields'][$id]['match'] == 'contain' && false !== strpos(strtolower($value), strtolower($validation[$header]))){
|
||||
$include = true;
|
||||
}
|
||||
if($include){
|
||||
$valid[$header] = $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
if($validator_count !== count($valid)){
|
||||
continue;
|
||||
}
|
||||
$result[] = $row;
|
||||
}
|
||||
}
|
||||
|
||||
$send = [
|
||||
'count' => count($result),
|
||||
'rows' => $result,
|
||||
'settings' => $checker['result'],
|
||||
'output' => $checker['output']
|
||||
];
|
||||
|
||||
wp_send_json($send);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Load all data from sheet (for show all mode)
|
||||
*/
|
||||
public function checker_load_all_data() {
|
||||
$post_id = isset($_REQUEST['checker_id']) ? intval($_REQUEST['checker_id']) : 0;
|
||||
$limit = isset($_REQUEST['limit']) ? intval($_REQUEST['limit']) : 100;
|
||||
|
||||
if (!$post_id) {
|
||||
wp_send_json_error(['message' => 'Invalid checker ID']);
|
||||
return;
|
||||
}
|
||||
|
||||
$checker = get_post_meta($post_id, 'checker', true);
|
||||
|
||||
if (!$checker || !isset($checker['link'])) {
|
||||
wp_send_json_error(['message' => 'Checker not found']);
|
||||
return;
|
||||
}
|
||||
|
||||
// Security check - rate limiting only
|
||||
$ip = CHECKER_SECURITY::get_client_ip();
|
||||
$rate_limit = CHECKER_SECURITY::check_rate_limit($post_id, $ip);
|
||||
if (!$rate_limit['allowed']) {
|
||||
wp_send_json_error([
|
||||
'message' => $rate_limit['message'],
|
||||
'type' => 'rate_limit'
|
||||
]);
|
||||
return;
|
||||
}
|
||||
|
||||
$url = $checker['link'];
|
||||
$link_format = substr($url, -3);
|
||||
$delimiter = $link_format == 'tsv' ? "\t" : ",";
|
||||
|
||||
$data = [];
|
||||
$handle = fopen($url, "r");
|
||||
|
||||
if ($handle !== false) {
|
||||
$keys = fgetcsv($handle, 0, $delimiter);
|
||||
$count = 0;
|
||||
|
||||
while (($row = fgetcsv($handle, 0, $delimiter)) !== false && $count < $limit) {
|
||||
if (count($keys) === count($row)) {
|
||||
$data[] = array_combine($keys, $row);
|
||||
$count++;
|
||||
}
|
||||
}
|
||||
fclose($handle);
|
||||
}
|
||||
|
||||
wp_send_json([
|
||||
'count' => count($data),
|
||||
'rows' => $data,
|
||||
'settings' => $checker['result'],
|
||||
'output' => $checker['output'],
|
||||
'url_params' => $checker['url_params'] ?? [],
|
||||
'filter_mode' => $checker['result']['filter_mode'] ?? 'search'
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user