Files
medicalalert-web-reloaded/wp/wp-content/plugins/facetwp/includes/class-ajax.php
Tony Volpe 779393381f Merged in feature/plugins-update (pull request #9)
wp plugin updates from pantheon

* wp plugin updates from pantheon
2023-12-15 18:08:21 +00:00

322 lines
9.2 KiB
PHP

<?php
class FacetWP_Ajax
{
function __construct() {
add_action( 'init', [ $this, 'switchboard' ], 1000 );
}
function switchboard() {
$valid_actions = [
'resume_index',
'save_settings',
'rebuild_index',
'get_info',
'get_query_args',
'heartbeat',
'license',
'backup'
];
$action = isset( $_POST['action'] ) ? sanitize_key( $_POST['action'] ) : '';
$is_valid = false;
if ( 0 === strpos( $action, 'facetwp_' ) ) {
$action = substr( $action, 8 );
$is_valid = in_array( $action, $valid_actions );
}
if ( $is_valid ) {
// Non-authenticated
if ( in_array( $action, [ 'resume_index' ] ) ) {
$this->$action();
}
// Authenticated
elseif ( current_user_can( 'manage_options' ) ) {
if ( wp_verify_nonce( $_POST['nonce'], 'fwp_admin_nonce' ) ) {
$this->$action();
}
}
}
// Listen for API refresh call
add_action( 'facetwp_refresh', [ $this, 'refresh' ] );
// Backwards compatibility
$this->url_vars = FWP()->request->url_vars;
$this->is_preload = FWP()->request->is_preload;
}
/**
* Save admin settings
*/
function save_settings() {
$settings = $_POST['data'];
if ( isset( $settings['settings'] ) ) {
update_option( 'facetwp_settings', json_encode( $settings ), 'no' );
if ( FWP()->diff->is_reindex_needed() ) {
$response = [
'code' => 'error',
'message' => __( 'Settings saved, please re-index', 'fwp' )
];
}
else {
$response = [
'code' => 'success',
'message' => __( 'Settings saved', 'fwp' )
];
}
}
else {
$response = [
'code' => 'error',
'message' => __( 'Error: invalid JSON', 'fwp' )
];
}
wp_send_json( $response );
}
/**
* Rebuild the index table
*/
function rebuild_index() {
update_option( 'facetwp_indexing_cancelled', 'no', 'no' );
FWP()->indexer->index();
exit;
}
function get_info() {
$type = $_POST['type'];
if ( 'post_types' == $type ) {
$post_types = get_post_types( [ 'exclude_from_search' => false, '_builtin' => false ] );
$post_types = [ 'post', 'page' ] + $post_types;
sort( $post_types );
$response = [
'code' => 'success',
'message' => implode( ', ', $post_types )
];
}
elseif ( 'indexer_stats' == $type ) {
$last_indexed = get_option( 'facetwp_last_indexed' );
$last_indexed = $last_indexed ? human_time_diff( $last_indexed ) . ' ago' : 'never';
$response = [
'code' => 'success',
'message' => "last indexed: $last_indexed"
];
}
elseif ( 'cancel_reindex' == $type ) {
update_option( 'facetwp_indexing_cancelled', 'yes' );
$response = [
'code' => 'success',
'message' => 'Indexing cancelled'
];
}
elseif ( 'purge_index_table' == $type ) {
global $wpdb;
$wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}facetwp_index" );
delete_option( 'facetwp_version' );
delete_option( 'facetwp_indexing' );
delete_option( 'facetwp_transients' );
$response = [
'code' => 'success',
'message' => __( 'Done, please re-index', 'fwp' )
];
}
wp_send_json( $response );
}
/**
* Return query arguments based on a Query Builder object
*/
function get_query_args() {
$query_obj = $_POST['query_obj'];
if ( is_array( $query_obj ) ) {
$query_args = FWP()->builder->parse_query_obj( $query_obj );
}
wp_send_json( $query_args );
}
/**
* Keep track of indexing progress
*/
function heartbeat() {
$output = [
'pct' => FWP()->indexer->get_progress()
];
if ( -1 == $output['pct'] ) {
$output['rows'] = FWP()->helper->get_row_counts();
}
wp_send_json( $output );
}
/**
* License activation
*/
function license() {
$license = sanitize_key( $_POST['license'] );
$request = wp_remote_post( 'https://api.facetwp.com', [
'body' => [
'action' => 'activate',
'slug' => 'facetwp',
'license' => $license,
'host' => FWP()->helper->get_http_host(),
]
] );
if ( ! is_wp_error( $request ) || 200 == wp_remote_retrieve_response_code( $request ) ) {
update_option( 'facetwp_license', $license );
update_option( 'facetwp_activation', $request['body'] );
update_option( 'facetwp_updater_last_checked', 0 );
echo $request['body'];
}
else {
echo json_encode( [
'status' => 'error',
'message' => __( 'Error', 'fwp' ) . ': ' . $request->get_error_message(),
] );
}
exit;
}
/**
* Import / export functionality
*/
function backup() {
$action_type = $_POST['action_type'];
$output = [];
if ( 'export' == $action_type ) {
$items = $_POST['items'];
if ( ! empty( $items ) ) {
foreach ( $items as $item ) {
if ( 'facet' == substr( $item, 0, 5 ) ) {
$item_name = substr( $item, 6 );
$output['facets'][] = FWP()->helper->get_facet_by_name( $item_name );
}
elseif ( 'template' == substr( $item, 0, 8 ) ) {
$item_name = substr( $item, 9 );
$output['templates'][] = FWP()->helper->get_template_by_name( $item_name );
}
}
}
echo json_encode( $output );
}
elseif ( 'import' == $action_type ) {
$settings = FWP()->helper->settings;
$import_code = $_POST['import_code'];
$overwrite = (int) $_POST['overwrite'];
if ( empty( $import_code ) || ! is_array( $import_code ) ) {
_e( 'Nothing to import', 'fwp' );
exit;
}
$status = [
'imported' => [],
'skipped' => [],
];
foreach ( $import_code as $object_type => $object_items ) {
foreach ( $object_items as $object_item ) {
$is_match = false;
foreach ( $settings[$object_type] as $key => $settings_item ) {
if ( $object_item['name'] == $settings_item['name'] ) {
if ( $overwrite ) {
$settings[$object_type][$key] = $object_item;
$status['imported'][] = $object_item['label'];
}
else {
$status['skipped'][] = $object_item['label'];
}
$is_match = true;
break;
}
}
if ( ! $is_match ) {
$settings[$object_type][] = $object_item;
$status['imported'][] = $object_item['label'];
}
}
}
update_option( 'facetwp_settings', json_encode( $settings ) );
if ( ! empty( $status['imported'] ) ) {
echo ' [<strong>' . __( 'Imported', 'fwp' ) . '</strong>] ' . implode( ', ', $status['imported'] );
}
if ( ! empty( $status['skipped'] ) ) {
echo ' [<strong>' . __( 'Skipped', 'fwp' ) . '</strong>] ' . implode( ', ', $status['skipped'] );
}
}
exit;
}
/**
* The AJAX facet refresh handler
*/
function refresh() {
global $wpdb;
$params = FWP()->request->process_post_data();
$output = FWP()->facet->render( $params );
$data = stripslashes_deep( $_POST['data'] );
// Ignore invalid UTF-8 characters in PHP 7.2+
if ( version_compare( phpversion(), '7.2', '<' ) ) {
$output = json_encode( $output );
}
else {
$output = json_encode( $output, JSON_INVALID_UTF8_IGNORE );
}
echo apply_filters( 'facetwp_ajax_response', $output, [
'data' => $data
] );
exit;
}
/**
* Resume stalled indexer
*/
function resume_index() {
$touch = (int) FWP()->indexer->get_transient( 'touch' );
if ( 0 < $touch && $_POST['touch'] == $touch ) {
FWP()->indexer->index();
}
exit;
}
}