*/
class A2reviews_Admin {
/**
* The ID of this plugin.
*
* @since 1.0.0
* @access private
* @var string $plugin_name The ID of this plugin.
*/
private $plugin_name;
/**
* The version of this plugin.
*
* @since 1.0.0
* @access private
* @var string $version The current version of this plugin.
*/
private $version;
/**
* The options object
*
* @since 1.0.0
* @access private
* @var string $version The current version of this plugin.
*/
private $options;
private $site_url = '';
private $domain = '';
protected $ajaxData;
private $isAuth;
/**
* Ajax events
*
* @since 1.0.0
* @access private
* @var string $version The current version of this plugin.
*/
private $ajax_events = [
'do_authentication' => false,
'do_open_app' => false,
'save_settings' => false,
];
/**
* Initialize the class and set its properties.
*
* @since 1.0.0
* @param string $plugin_name The name of this plugin.
* @param string $version The version of this plugin.
*/
public function __construct( $plugin_name, $version ) {
$this->plugin_name = $plugin_name;
$this->version = $version;
$this->options = get_option( 'a2reviews_options' );
foreach ( $this->ajax_events as $ajax_event => $nopriv ) {
add_action( 'wp_ajax_a2reviews_' . $ajax_event, array( $this, esc_attr( $ajax_event ) ) );
if ( $nopriv ) {
add_action( 'wp_ajax_a2reviews_nopriv_' . $ajax_event, array( $this, esc_attr( $ajax_event ) ) );
}
}
$this->site_url = get_site_url();
$domain = str_replace(['http://', 'https://', 'http://www.', 'https://www.'], '', $this->site_url);
$this->domain = $domain;
$this->isAuth = A2reviews_API::isAuth();
//Add a2reviews menu to wordpress admin
add_action( 'admin_menu', array( $this, 'add_plugin_page' ) );
add_action( 'admin_init', function(){
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
$page = isset($_GET['page'])? sanitize_key( wp_unslash( $_GET['page'] ) ): ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only page check; the open action below is nonce-protected.
$open_app = isset($_GET['open-a2app']); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Verified immediately below.
if( 'a2reviews-setting-admin' === $page && $open_app ) {
if ( ! isset( $_GET['_a2nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET['_a2nonce'] ) ), 'a2reviews_open_app' ) ) {
wp_die( esc_html__( 'Security check failed.', 'a2reviews' ) );
}
$this->loginToA2App();
}
} , 10 );
$this->product_column();
}
/**
* Add options page
*/
public function add_plugin_page(){
// This page will be under "Settings"
add_options_page(
'A2reviews',
'A2reviews',
'manage_options',
'a2reviews-setting-admin',
array( $this, 'create_admin_page' )
);
add_action( 'admin_bar_menu', function(WP_Admin_Bar $admin_bar) {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
$admin_bar->add_menu( array(
'id' => 'a2reviews-menu',
'parent' => null,
'group' => null,
'title' => '✪ A2reviews', //you can use img tag with image link. it will show the image icon Instead of the title.
'href' => admin_url('options-general.php?page=a2reviews-setting-admin'),
'meta' => [
'title' => __( '✪ A2Reviews', 'a2reviews' ), //This title will show on hover
]
) );
if($this->isAuth){
$admin_bar->add_menu( array(
'id' => 'a2reviews-app',
'parent' => 'a2reviews-menu',
'group' => null,
'title' => '✪ A2Reviews App', //you can use img tag with image link. it will show the image icon Instead of the title.
'href' => wp_nonce_url( admin_url('options-general.php?page=a2reviews-setting-admin&open-a2app=true'), 'a2reviews_open_app', '_a2nonce' ),
'meta' => [
'title' => __( '✪ A2Reviews App', 'a2reviews' ), //This title will show on hover
]
) );
}
}, 500 );
}
/**
* Product column
*
* @since 1.0.0
*/
public function product_column(){
add_filter( 'manage_product_posts_columns', function($columns){
$columns['a2reviews'] = __( '✪ A2 Rating', 'a2reviews' );
return $columns;
});
add_action( 'manage_product_posts_custom_column' , function($column, $post_id){
switch ( $column ) {
case 'a2reviews' :
$avg_rating = get_post_meta($post_id, 'a2_meta_avg_rating', true);
$avg_rating = ($avg_rating)? $avg_rating: 0;
$total = get_post_meta( $post_id, 'a2_meta_total_rating', true );
$total = ($total)? $total: 0;
$allowed = array(
'el-rate' => array(
'value' => true,
'disabled' => true,
'show-score' => true,
'text-color' => true,
'score-template' => true,
),
);
echo wp_kses( '', $allowed );
echo '
'.esc_html($total).' reviews
';
break;
}
}, 10, 2 );
}
/**
* is woocommerce active
*
* @since 1.0.0
*/
public function is_woocommerce_active(){
return class_exists( 'WooCommerce' );
}
/**
* Check security
*
* @since 1.0.0
*/
public function check_security(){
$postdata = file_get_contents("php://input");
$custom_request = json_decode($postdata);
$this->ajaxData = $custom_request;
if ( ! isset( $this->ajaxData->security )
|| ! wp_verify_nonce( $this->ajaxData->security, 'a2_settings_auth' )
) {
return false;
}else{
return true;
}
}
/**
* Do authentication
*
* @since 1.0.0
*/
public function do_authentication(){
$url = $message = '';
if($this->check_security()){
flush_rewrite_rules(true);
$access_token = md5(wp_generate_password( 26, false ));
$access_token = sanitize_text_field($access_token);
update_option( 'a2reviews_access_token', $access_token );
$app_url = A2REVIEWS_APP_URL;
$domain = $this->domain;
$code = md5(wp_generate_password( 20, false ));
$timestamp = time();
$ssl = strpos($this->site_url, 'https://') !== false? 'true': 'false';
$return_url = get_admin_url(). 'options-general.php?page=a2reviews-setting-admin';
$code = sanitize_text_field($code);
update_option( 'a2reviews_auth_code', $code );
$url = "$app_url/woo-auth/?shop=$domain&code=$code×tamp=$timestamp&ssl=$ssl&return_url=$return_url";
$status = 'success';
}else{
$status = 'error';
$message = 'Sorry, your nonce did not verify.';
}
wp_send_json( [
'status' => $status,
'message' => $message,
'url' => $url
], 200 );
}
/**
* Do authentication open a2 reviews app
*
* @since 1.0.0
*/
public function do_open_app(){
$url = $message = '';
if($this->check_security()){
$app_url = A2REVIEWS_APP_URL;
$domain = $this->domain;
$ssl = strpos($this->site_url, 'https://') !== false? 'true': 'false';
$code = $this->ajaxData->security;
$timestamp = time();
$str_2_hash = "$domain-$code-$timestamp";
$hmac = hash_hmac( 'sha256', base64_encode($str_2_hash), md5(get_option( 'a2reviews_access_token' )));
$url = "$app_url/woo-auth-login/?shop=$domain&code=$code&hmac=$hmac×tamp=$timestamp&ssl=$ssl";
$status = 'success';
update_option( 'a2reviews_auth_code', $code );
}else{
$status = 'error';
$message = __('Sorry, your nonce did not verify.', 'a2reviews');
}
wp_send_json( [
'status' => $status,
'message' => $message,
'url' => $url,
'domain' => $domain
], 200 );
}
/**
* Do authentication open a2 reviews app
*
* @since 1.0.0
*/
private function loginToA2App(){
$app_url = A2REVIEWS_APP_URL;
$domain = $this->domain;
$ssl = strpos($this->site_url, 'https://') !== false? 'true': 'false';
$code = wp_create_nonce( 'a2-security' );
$timestamp = time();
$str_2_hash = "$domain-$code-$timestamp";
$hmac = hash_hmac( 'sha256', base64_encode($str_2_hash), md5(get_option( 'a2reviews_access_token' )));
$url = "$app_url/woo-auth-login/?shop=$domain&code=$code&hmac=$hmac×tamp=$timestamp&ssl=$ssl";
update_option( 'a2reviews_auth_code', $code );
// Allow the known A2Reviews application host as a safe redirect target.
add_filter( 'allowed_redirect_hosts', function( $hosts ){
$app_host = wp_parse_url( A2REVIEWS_APP_URL, PHP_URL_HOST );
if ( $app_host ) {
$hosts[] = $app_host;
}
return $hosts;
} );
wp_safe_redirect( $url );
exit;
}
/**
* Save settings from ajax.
*
* @since 1.0.0
*/
public function save_settings(){
$update = 0;
$message = '';
if ( !$this->check_security() ) {
$status = 'error';
$message = __('Sorry, your nonce did not verify.', 'a2reviews');
} else {
$settings = $this->ajaxData->settings;
flush_rewrite_rules(true);
if($settings && is_object($settings)){
$update = update_option( 'a2reviews_options', $settings);
$status = 'success';
}
}
wp_send_json( [
'status' => $status,
'message' => $message,
'update' => $update
], 200 );
}
/**
* Options page callback
*/
public function create_admin_page(){
$settings = new stdClass();
if( $this->isAuth && is_object( $this->options ) ){
$this->options->authentication = true;
$settings = $this->options;
}
$json = wp_json_encode( $settings, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT );
if ( function_exists( 'wp_print_inline_script_tag' ) ) {
wp_print_inline_script_tag( 'var a2reviews_settings = ' . $json . ';' );
} else {
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- wp_json_encode() with JSON_HEX_* flags is safe to print inside a script element.
echo '';
}
include( plugin_dir_path(__FILE__) . 'partials/a2reviews-admin-display.php');
}
/**
* Register the stylesheets for the admin area.
*
* @since 1.0.0
*/
public function enqueue_styles() {
/**
* This function is provided for demonstration purposes only.
*
* An instance of this class should be passed to the run() function
* defined in A2reviews_Loader as all of the hooks are defined
* in that particular class.
*
* The A2reviews_Loader will then create the relationship
* between the defined hooks and the functions defined in this
* class.
*/
wp_enqueue_style( $this->plugin_name. '-element-ui', plugin_dir_url( __FILE__ ) . 'css/element-ui.css', array(), $this->version, 'all' );
wp_enqueue_style( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'css/a2reviews-admin.css', array(), $this->version, 'all' );
}
/**
* Register the JavaScript for the admin area.
*
* @since 1.0.0
*/
public function enqueue_scripts() {
/**
* This function is provided for demonstration purposes only.
*
* An instance of this class should be passed to the run() function
* defined in A2reviews_Loader as all of the hooks are defined
* in that particular class.
*
* The A2reviews_Loader will then create the relationship
* between the defined hooks and the functions defined in this
* class.
*/
wp_enqueue_script( $this->plugin_name. '-vue-min', plugin_dir_url( __FILE__ ) . 'js/vue.min.js', array(), $this->version, true );
wp_enqueue_script( $this->plugin_name. '-element-ui-min', plugin_dir_url( __FILE__ ) . 'js/element-ui.min.js', array(), $this->version, true );
wp_enqueue_script( $this->plugin_name. '-axios-min', plugin_dir_url( __FILE__ ) . 'js/axios.min.js', array(), $this->version, true );
wp_enqueue_script( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'js/a2reviews-admin.js', array( 'jquery' ), $this->version, true );
}
}