- 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>
181 lines
8.8 KiB
PHP
Executable File
181 lines
8.8 KiB
PHP
Executable File
<?php
|
|
|
|
use WPDRMS\ASP\Query\SearchQuery;
|
|
use WPDRMS\ASP\Utils\Ajax;
|
|
|
|
if (!class_exists("wd_CPTSelect")) {
|
|
/**
|
|
* Class wd_CPTSelect
|
|
*
|
|
* Post/page/cpt select and search class.
|
|
*
|
|
* @package WPDreams/OptionsFramework/Classes
|
|
* @category Class
|
|
* @author Ernest Marcinko <ernest.marcinko@wp-dreams.com>
|
|
* @link http://wp-dreams.com, http://codecanyon.net/user/anago/portfolio
|
|
* @copyright Copyright (c) 2016, Ernest Marcinko
|
|
*/
|
|
class wd_CPTSelect extends wpdreamsType {
|
|
private $args = array(
|
|
'show_parent_checkbox' => 1
|
|
);
|
|
private $e_data;
|
|
|
|
public function getType() {
|
|
parent::getType();
|
|
$this->processData();
|
|
?>
|
|
<div class='wd_cpt_select' id='wd_cpt_select-<?php echo self::$_instancenumber; ?>'>
|
|
<fieldset>
|
|
<div style='margin:15px 30px;text-align: left; line-height: 45px;'>
|
|
<label>
|
|
<?php echo __('Search posts/pages/cpt:', 'ajax-search-pro'); ?>
|
|
<input type="hidden" class="wd_cpt_select_search_nonce" value="<?php echo wp_create_nonce( 'wd_cpt_select_search_nonce' ); ?>">
|
|
<input type="text" class="wd_cpt_search" placeholder="<?php echo __('Type title or ID here..', 'ajax-search-pro'); ?>"/>
|
|
</label>
|
|
</div>
|
|
<legend><?php echo $this->label; ?></legend>
|
|
<div class="draggablecontainer" id="sortablecontainer<?php echo self::$_instancenumber; ?>">
|
|
<div class="dragLoader hiddend"></div>
|
|
<p><?php echo __('Results', 'ajax-search-pro'); ?></p>
|
|
<ul id="sortable<?php echo self::$_instancenumber; ?>" class="connectedSortable wd_csortable<?php echo self::$_instancenumber; ?>">
|
|
<?php echo __('Use the search to look for posts', 'ajax-search-pro'); ?> :)
|
|
</ul>
|
|
</div>
|
|
<div class="sortablecontainer"><p><?php echo __('Drag here the ones you want to', 'ajax-search-pro'); ?> <span style="font-weight: bold;" class="tts_type"><?php echo $this->e_data['op_type']; ?></span>!</p>
|
|
<ul id="sortable_conn<?php echo self::$_instancenumber; ?>" class="connectedSortable wd_csortable<?php echo self::$_instancenumber; ?>">
|
|
<?php $this->printSelectedPosts(); ?>
|
|
</ul>
|
|
</div>
|
|
|
|
<input type='hidden' value="<?php echo base64_encode(json_encode($this->args)); ?>" class="wd_args">
|
|
<input isparam=1 type='hidden' value="<?php echo (is_array($this->data) && isset($this->data['value'])) ? $this->data['value'] : $this->data; ?>" name='<?php echo $this->name; ?>'>
|
|
</fieldset>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
private function printSelectedPosts() {
|
|
if ( count($this->e_data['ids']) > 0 ) {
|
|
$ptypes = get_post_types(array(
|
|
"public" => true,
|
|
"_builtin" => false
|
|
), "names", "OR");
|
|
$ptypes = array_diff($ptypes, array(
|
|
"revision", "nav_menu_item", "attachment", "acf", "wpcf7_contact_form", "dslc_templates",
|
|
"acf-field", "acf-group", "acf-groups"
|
|
));
|
|
|
|
$items = get_posts(array(
|
|
'posts_per_page' => count($this->e_data['ids']),
|
|
'post_type' => $ptypes,
|
|
'post__in' => $this->e_data['ids'],
|
|
'post_status' => 'any'
|
|
));
|
|
foreach ($items as $p) {
|
|
if (empty($p) || is_wp_error($p))
|
|
continue;
|
|
$checkbox = "";
|
|
if ($this->args['show_parent_checkbox'] == 1 && $p->post_type == 'page')
|
|
$checkbox = '<div class="exclude_child">' . __('Exclude direct children too?', 'ajax-search-pro') . ' <input type="checkbox" value="' . $p->ID . '"
|
|
' . (in_array($p->ID, $this->e_data['parent_ids']) ? ' checked="checked"' : '') . '/></div>';
|
|
echo '
|
|
<li class="ui-state-default" post_id="' . $p->ID . '">' . $p->post_title . '
|
|
<span class="extra_info">[id: '.$p->ID.'] [' . $p->post_type . '] [' . $p->post_status . ']</span>
|
|
' . $checkbox . '
|
|
<a class="deleteIcon"></a></li>
|
|
';
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function searchPosts() {
|
|
if (
|
|
isset($_POST['wd_phrase'], $_POST['wd_cpt_select_search_nonce']) &&
|
|
( current_user_can( 'manage_options' ) || apply_filters('wpdrms/backend/options/ajax/user_role_override', false) ) &&
|
|
wp_verify_nonce( $_POST["wd_cpt_select_search_nonce"], 'wd_cpt_select_search_nonce' )
|
|
) {
|
|
$phrase = trim($_POST['wd_phrase']);
|
|
$data = json_decode(base64_decode($_POST['wd_args']), true);
|
|
|
|
$ptypes = get_post_types(array(
|
|
"public" => true,
|
|
"_builtin" => false
|
|
), "names", "OR");
|
|
|
|
$exclude = array("revision", "nav_menu_item", 'peepso-post', 'peepso-comment', "acf",
|
|
"oembed_cache", "user_request", "wp_block", "shop_coupon", "avada_page_options",
|
|
"_pods_template", "_pods_pod", "_pods_field", "bp-email",
|
|
"lbmn_archive", "lbmn_footer", "mc4wp-form",
|
|
"elementor-front", "elementor-icon",
|
|
"fusion_template", "fusion_element", "wc_product_tab", "customize_changeset",
|
|
"wpcf7_contact_form", "dslc_templates", "acf-field", "acf-group", "acf-groups", "acf-field-group", "custom_css");
|
|
|
|
$ptypes = array_diff($ptypes, $exclude);
|
|
|
|
$asp_query = new SearchQuery(array(
|
|
"s" => $phrase,
|
|
"_ajax_search" => false,
|
|
'keyword_logic' => 'and',
|
|
'secondary_logic' => 'or',
|
|
"posts_per_page" => 20,
|
|
'post_type' => $ptypes,
|
|
'post_status' => array('publish', 'future', 'pending', 'private'),
|
|
'post_fields' => array(
|
|
'title', 'ids'
|
|
)
|
|
));
|
|
|
|
$results = $asp_query->posts;
|
|
Ajax::prepareHeaders();
|
|
if ( ! empty( $results ) ) {
|
|
echo "Results (".count($results)."): ";
|
|
foreach ( $results as $p ) {
|
|
$checkbox = "";
|
|
if ($data['show_parent_checkbox'] == 1 && $p->post_type == 'page')
|
|
$checkbox = '<div class="exclude_child">' . __('Exclude direct children too?', 'ajax-search-pro') . ' <input type="checkbox" value="' . $p->ID . '"/></div>';
|
|
echo '
|
|
<li class="ui-state-default" post_id="' . $p->ID . '">'. $p->post_title . '
|
|
<span class="extra_info">[id: '.$p->ID.'] ['.$p->post_type.'] ['.$p->post_status.']</span>
|
|
' . $checkbox . '
|
|
<a class="deleteIcon"></a></li>
|
|
';
|
|
}
|
|
} else {
|
|
echo __('No items found for term:', 'ajax-search-pro') . ' <b>' . esc_html($phrase) .'<b>';
|
|
}
|
|
}
|
|
die();
|
|
}
|
|
|
|
public function processData() {
|
|
// Get the args first if exists
|
|
if ( is_array($this->data) && isset($this->data['args']) )
|
|
$this->args = array_merge($this->args, $this->data['args']);
|
|
|
|
if ( is_array($this->data) && isset($this->data['value']) ) {
|
|
// If called from back-end non-post context
|
|
$this->e_data = $this->decode_param($this->data['value']);
|
|
$this->data = $this->encode_param($this->data['value']);
|
|
} else {
|
|
// POST method or something else
|
|
$this->e_data = $this->decode_param($this->data);
|
|
$this->data = $this->encode_param($this->data);
|
|
}
|
|
/**
|
|
* At this point the this->data variable surely contains the encoded data, no matter what.
|
|
*/
|
|
}
|
|
|
|
public final function getData() {
|
|
return $this->data;
|
|
}
|
|
|
|
public final function getSelected() {
|
|
return $this->e_data;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !has_action('wp_ajax_wd_search_cpt') )
|
|
add_action('wp_ajax_wd_search_cpt', 'wd_CPTSelect::searchPosts');
|