parent
865ec23ab6
commit
e517bdff99
@ -0,0 +1,197 @@ |
|||||||
|
<?php |
||||||
|
function add_comment_like() { |
||||||
|
global $wpdb; |
||||||
|
$table_name = $wpdb->prefix . 'cosmopet_likes'; |
||||||
|
$wpdb->show_errors(); |
||||||
|
if (!is_user_logged_in()) { |
||||||
|
wp_send_json_error('Необходимо авторизоваться'); |
||||||
|
die(); |
||||||
|
} |
||||||
|
$comment_id = isset($_POST['comment_id']) ? intval($_POST['comment_id']) : 0; |
||||||
|
$user_id = get_current_user_id(); |
||||||
|
if ($comment_id) { |
||||||
|
$comment_exists = get_comment($comment_id); |
||||||
|
if (!$comment_exists) { |
||||||
|
echo '0'; |
||||||
|
die(); |
||||||
|
} |
||||||
|
$existing_like = $wpdb->get_var($wpdb->prepare( |
||||||
|
"SELECT COUNT(*) FROM $table_name WHERE comment_id = %d AND user_id = %d", |
||||||
|
$comment_id, $user_id |
||||||
|
)); |
||||||
|
if (!$existing_like) { |
||||||
|
$result = $wpdb->insert( |
||||||
|
$table_name, |
||||||
|
array( |
||||||
|
'user_id' => $user_id, |
||||||
|
'comment_id' => $comment_id, |
||||||
|
'date_added' => current_time('mysql') |
||||||
|
), |
||||||
|
array('%d', '%d', '%s') |
||||||
|
); |
||||||
|
} else { |
||||||
|
$result = $wpdb->delete( |
||||||
|
$table_name, |
||||||
|
array( |
||||||
|
'user_id' => $user_id, |
||||||
|
'comment_id' => $comment_id |
||||||
|
), |
||||||
|
array('%d', '%d') |
||||||
|
); |
||||||
|
} |
||||||
|
$likes = get_comment_likes_count($comment_id); |
||||||
|
wp_send_json(array( |
||||||
|
'count' => $likes, |
||||||
|
'is_liked' => !$existing_like |
||||||
|
)); |
||||||
|
} else { |
||||||
|
wp_send_json(array('count' => 0, 'is_liked' => false)); |
||||||
|
} |
||||||
|
die(); |
||||||
|
} |
||||||
|
add_action('wp_ajax_add_comment_like', 'add_comment_like'); |
||||||
|
|
||||||
|
function add_post_like() { |
||||||
|
global $wpdb; |
||||||
|
$table_name = $wpdb->prefix . 'cosmopet_likes'; |
||||||
|
if (!is_user_logged_in()) { |
||||||
|
wp_send_json_error('Необходимо авторизоваться'); |
||||||
|
die(); |
||||||
|
} |
||||||
|
$post_id = isset($_POST['post_id']) ? intval($_POST['post_id']) : 0; |
||||||
|
$user_id = get_current_user_id(); |
||||||
|
if ($post_id) { |
||||||
|
$existing_like = $wpdb->get_var($wpdb->prepare( |
||||||
|
"SELECT COUNT(*) FROM $table_name WHERE post_id = %d AND user_id = %d", |
||||||
|
$post_id, $user_id |
||||||
|
)); |
||||||
|
if (!$existing_like) { |
||||||
|
$wpdb->insert( |
||||||
|
$table_name, |
||||||
|
array( |
||||||
|
'user_id' => $user_id, |
||||||
|
'post_id' => $post_id, |
||||||
|
'date_added' => current_time('mysql') |
||||||
|
), |
||||||
|
array('%d', '%d', '%s') |
||||||
|
); |
||||||
|
} else { |
||||||
|
$wpdb->delete( |
||||||
|
$table_name, |
||||||
|
array( |
||||||
|
'user_id' => $user_id, |
||||||
|
'post_id' => $post_id |
||||||
|
), |
||||||
|
array('%d', '%d') |
||||||
|
); |
||||||
|
} |
||||||
|
$likes = get_post_likes_count($post_id); |
||||||
|
wp_send_json(array( |
||||||
|
'count' => $likes, |
||||||
|
'is_liked' => !$existing_like |
||||||
|
)); |
||||||
|
} |
||||||
|
die(); |
||||||
|
} |
||||||
|
add_action('wp_ajax_add_post_like', 'add_post_like'); |
||||||
|
|
||||||
|
function check_user_likes() { |
||||||
|
global $wpdb; |
||||||
|
$table_name = $wpdb->prefix . 'cosmopet_likes'; |
||||||
|
if (!is_user_logged_in()) { |
||||||
|
wp_send_json_error('Необходимо авторизоваться'); |
||||||
|
die(); |
||||||
|
} |
||||||
|
$user_id = get_current_user_id(); |
||||||
|
$liked_posts = $wpdb->get_col($wpdb->prepare( |
||||||
|
"SELECT post_id FROM $table_name WHERE user_id = %d AND post_id > 0", |
||||||
|
$user_id |
||||||
|
)); |
||||||
|
$liked_comments = $wpdb->get_col($wpdb->prepare( |
||||||
|
"SELECT comment_id FROM $table_name WHERE user_id = %d AND comment_id > 0", |
||||||
|
$user_id |
||||||
|
)); |
||||||
|
$response = array( |
||||||
|
'posts' => $liked_posts, |
||||||
|
'comments' => $liked_comments |
||||||
|
); |
||||||
|
echo json_encode($response); |
||||||
|
die(); |
||||||
|
} |
||||||
|
add_action('wp_ajax_check_user_likes', 'check_user_likes'); |
||||||
|
|
||||||
|
|
||||||
|
function get_post_likes_count($post_id) { |
||||||
|
global $wpdb; |
||||||
|
$table_name = $wpdb->prefix . 'cosmopet_likes'; |
||||||
|
$count = $wpdb->get_var($wpdb->prepare( |
||||||
|
"SELECT COUNT(*) FROM $table_name WHERE post_id = %d", |
||||||
|
$post_id |
||||||
|
)); |
||||||
|
return $count ? $count : 0; |
||||||
|
} |
||||||
|
|
||||||
|
function get_comment_likes_count($comment_id) { |
||||||
|
global $wpdb; |
||||||
|
$table_name = $wpdb->prefix . 'cosmopet_likes'; |
||||||
|
$count = $wpdb->get_var($wpdb->prepare( |
||||||
|
"SELECT COUNT(*) FROM $table_name WHERE comment_id = %d", |
||||||
|
$comment_id |
||||||
|
)); |
||||||
|
return $count ? $count : 0; |
||||||
|
} |
||||||
|
|
||||||
|
function is_user_liked_post($post_id) { |
||||||
|
if (!is_user_logged_in()) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
global $wpdb; |
||||||
|
$table_name = $wpdb->prefix . 'cosmopet_likes'; |
||||||
|
$user_id = get_current_user_id(); |
||||||
|
$result = $wpdb->get_var($wpdb->prepare( |
||||||
|
"SELECT COUNT(*) FROM $table_name WHERE post_id = %d AND user_id = %d", |
||||||
|
$post_id, $user_id |
||||||
|
)); |
||||||
|
return $result > 0; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
function is_user_liked_comment($comment_id) { |
||||||
|
if (!is_user_logged_in()) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
global $wpdb; |
||||||
|
$table_name = $wpdb->prefix . 'cosmopet_likes'; |
||||||
|
$user_id = get_current_user_id(); |
||||||
|
$result = $wpdb->get_var($wpdb->prepare( |
||||||
|
"SELECT COUNT(*) FROM $table_name WHERE comment_id = %d AND user_id = %d", |
||||||
|
$comment_id, $user_id |
||||||
|
)); |
||||||
|
return $result > 0; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
add_filter('comment_form_logged_in', '__return_empty_string'); |
||||||
|
|
||||||
|
|
||||||
|
// Создание таблицы |
||||||
|
function create_likes_table() { |
||||||
|
global $wpdb; |
||||||
|
$table_name = $wpdb->prefix . 'cosmopet_likes'; |
||||||
|
$charset_collate = $wpdb->get_charset_collate(); |
||||||
|
$sql = "CREATE TABLE IF NOT EXISTS $table_name ( |
||||||
|
id bigint(20) NOT NULL AUTO_INCREMENT, |
||||||
|
user_id bigint(20) NOT NULL, |
||||||
|
post_id bigint(20) DEFAULT '0', |
||||||
|
comment_id bigint(20) DEFAULT '0', |
||||||
|
date_added datetime DEFAULT CURRENT_TIMESTAMP, |
||||||
|
PRIMARY KEY (id), |
||||||
|
KEY post_id (post_id), |
||||||
|
KEY comment_id (comment_id), |
||||||
|
KEY user_id (user_id), |
||||||
|
UNIQUE KEY user_post (user_id, post_id, comment_id) |
||||||
|
) $charset_collate;"; |
||||||
|
require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); |
||||||
|
dbDelta($sql); |
||||||
|
} |
||||||
|
add_action('after_switch_theme', 'create_likes_table'); |
@ -1,2 +1,70 @@ |
|||||||
<?php |
<?php |
||||||
|
|
||||||
|
add_action('wp_ajax_get_cart_fragment', 'get_cart_fragment_callback'); |
||||||
|
add_action('wp_ajax_nopriv_get_cart_fragment', 'get_cart_fragment_callback'); |
||||||
|
|
||||||
|
function get_cart_fragment_callback() { |
||||||
|
// Проверяем nonce для безопасности |
||||||
|
check_ajax_referer('woocommerce-cart', 'security', false); |
||||||
|
|
||||||
|
// Получаем содержимое корзины |
||||||
|
ob_start(); |
||||||
|
wc_get_template('shop/cart-contents.twig', [], '', get_template_directory() . '/templates/'); |
||||||
|
$contents = ob_get_clean(); |
||||||
|
|
||||||
|
// Получаем футер корзины |
||||||
|
ob_start(); |
||||||
|
wc_get_template('modal-basket-footer.twig', [], '', get_template_directory() . '/templates/'); |
||||||
|
$footer = ob_get_clean(); |
||||||
|
|
||||||
|
// Получаем данные корзины |
||||||
|
$cart = WC()->cart; |
||||||
|
$count = $cart->get_cart_contents_count(); |
||||||
|
$total = $cart->get_total('raw'); // Числовая сумма |
||||||
|
$total_html = wc_cart_totals_order_total_html(); // Форматированная сумма |
||||||
|
|
||||||
|
wp_send_json_success([ |
||||||
|
'contents' => $contents, |
||||||
|
'footer' => $footer, |
||||||
|
'count' => $count, |
||||||
|
'total' => $total_html, |
||||||
|
'total_raw' => $total |
||||||
|
]); |
||||||
|
} |
||||||
|
|
||||||
|
add_action('template_redirect', 'custom_redirect_cart_page'); |
||||||
|
function custom_redirect_cart_page() { |
||||||
|
if (is_cart()) { |
||||||
|
wp_redirect(home_url('/')); |
||||||
|
exit; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
add_action('wp_enqueue_scripts', 'remove_woocommerce_styles_on_checkout', 9999); |
||||||
|
function remove_woocommerce_styles_on_checkout() { |
||||||
|
// Проверяем, что мы на странице чекаута |
||||||
|
if (function_exists('is_checkout') && is_checkout() && !is_order_received_page()) { |
||||||
|
wp_deregister_style('woocommerce-layout'); |
||||||
|
wp_deregister_style('woocommerce-smallscreen'); |
||||||
|
wp_deregister_style('woocommerce-general'); |
||||||
|
|
||||||
|
// Дополнительно: отключить другие стили WooCommerce |
||||||
|
wp_dequeue_style('select2'); |
||||||
|
wp_deregister_style('select2'); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
add_action('wp_head', 'custom_checkout_padding'); |
||||||
|
function custom_checkout_padding() { |
||||||
|
// Проверяем, что это страница Checkout |
||||||
|
if (is_checkout() && !is_admin()) { |
||||||
|
?> |
||||||
|
<style type="text/css"> |
||||||
|
main.wrapper { |
||||||
|
padding-top: 100px; |
||||||
|
padding-bottom: 50px; |
||||||
|
} |
||||||
|
</style> |
||||||
|
<?php |
||||||
|
} |
||||||
|
} |
||||||
|
@ -0,0 +1,22 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
register_sidebar( array( |
||||||
|
'name' => 'Сайдбар для фильтров товаров', |
||||||
|
'id' => 'sidebar_filters', |
||||||
|
'before_widget' => '<div id="%1$s" class="widget %2$s">', |
||||||
|
'after_widget' => '</div>', |
||||||
|
'before_title' => '<h3 class="widget-title">', |
||||||
|
'after_title' => '</h3>', |
||||||
|
) ); |
||||||
|
|
||||||
|
// Для кнопки "Применить фильтр" |
||||||
|
add_filter('wbw_filter_submit_button_text', 'change_wbw_filter_button_text'); |
||||||
|
function change_wbw_filter_button_text($text) { |
||||||
|
return 'Ваш текст'; // Например, "Фильтровать" или "Поиск" |
||||||
|
} |
||||||
|
|
||||||
|
// Для кнопки сброса (если есть) |
||||||
|
add_filter('wbw_filter_reset_button_text', 'change_wbw_reset_button_text'); |
||||||
|
function change_wbw_reset_button_text($text) { |
||||||
|
return 'Сбросить'; |
||||||
|
} |
@ -0,0 +1,238 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Email Validation |
||||||
|
* Validates the format of the provided email via AJAX. |
||||||
|
*/ |
||||||
|
add_action('wp_ajax_email_validate', 'email_validate'); |
||||||
|
add_action('wp_ajax_nopriv_email_validate', 'email_validate'); |
||||||
|
|
||||||
|
function email_validate() { |
||||||
|
if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false) { |
||||||
|
header("Content-Type: application/json"); |
||||||
|
echo json_encode(array( |
||||||
|
'status' => 'error', |
||||||
|
'text' => esc_html__('Invalid email format', 'woodmart') |
||||||
|
)); |
||||||
|
} |
||||||
|
wp_die(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Send Verification Code |
||||||
|
* Generates a random code, encrypts it, stores it in a cookie, and sends it via email. |
||||||
|
*/ |
||||||
|
add_action('wp_ajax_send_code', 'send_code'); |
||||||
|
add_action('wp_ajax_nopriv_send_code', 'send_code'); |
||||||
|
|
||||||
|
function send_code() { |
||||||
|
$email = sanitize_email($_POST['email']); |
||||||
|
if (!is_email($email)) { |
||||||
|
wp_die(json_encode(['status' => 'error', 'text' => 'Invalid email'])); |
||||||
|
} |
||||||
|
|
||||||
|
// Generate a random 4-digit code |
||||||
|
$code = sprintf("%04d", mt_rand(1000, 9999)); |
||||||
|
|
||||||
|
// Store code in a secure session for 5 minutes |
||||||
|
session_start(); |
||||||
|
$_SESSION['login_code'] = [ |
||||||
|
'code' => $code, |
||||||
|
'email' => $email, |
||||||
|
'expires' => time() + (5 * 60) |
||||||
|
]; |
||||||
|
session_write_close(); |
||||||
|
|
||||||
|
// Prepare email content |
||||||
|
$language = function_exists('pll_current_language') ? pll_current_language() : 'en'; |
||||||
|
if ($language === 'ru') { |
||||||
|
$subject = "Проверочный код Cosmopet - $code"; |
||||||
|
$message = "Привет, это Cosmopet.\nВаш проверочный код: $code\nДействителен 5 минут."; |
||||||
|
} else { |
||||||
|
$subject = "Cosmopet Verification Code - $code"; |
||||||
|
$message = "Hello, this is CosmoPet.\nYour verification code: $code\nValid for 5 minutes."; |
||||||
|
} |
||||||
|
|
||||||
|
// Configure email headers |
||||||
|
$headers = array( |
||||||
|
'From: Cosmopet <pro@cosmopet.shop>', |
||||||
|
'content-type: text/plain; charset=utf-8', |
||||||
|
'Reply-To: pro@cosmopet.shop', |
||||||
|
); |
||||||
|
|
||||||
|
// Send email with fallback logging |
||||||
|
$sent = wp_mail($email, $subject, $message, $headers); |
||||||
|
if ($sent) { |
||||||
|
wp_die(json_encode(['status' => 'success', 'message' => 'Code sent'])); |
||||||
|
} else { |
||||||
|
error_log("Email failed to send to $email. Error: " . json_encode(error_get_last())); |
||||||
|
wp_die(json_encode(['status' => 'error', 'text' => 'Failed to send code'])); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Check Verification Code |
||||||
|
* Validates the user-entered code, logs in or registers the user. |
||||||
|
*/ |
||||||
|
add_action('wp_ajax_check_code', 'check_code'); |
||||||
|
add_action('wp_ajax_nopriv_check_code', 'check_code'); |
||||||
|
|
||||||
|
function check_code() { |
||||||
|
header("Content-Type: application/json"); |
||||||
|
|
||||||
|
$code = sanitize_text_field($_POST['code']); |
||||||
|
$email = sanitize_email($_POST['email']); |
||||||
|
|
||||||
|
session_start(); |
||||||
|
if (isset($_SESSION['login_code']) && is_array($_SESSION['login_code'])) { |
||||||
|
$stored_data = $_SESSION['login_code']; |
||||||
|
if ($stored_data['email'] === $email && $stored_data['code'] === $code && $stored_data['expires'] > time()) { |
||||||
|
// Generate a random password |
||||||
|
$password = wp_generate_password(12, true, false); |
||||||
|
|
||||||
|
if (email_exists($email)) { |
||||||
|
// Log in existing user |
||||||
|
$user = get_user_by('email', $email); |
||||||
|
wp_set_password($password, $user->ID); |
||||||
|
$login = wp_signon([ |
||||||
|
'user_login' => $email, |
||||||
|
'user_password' => $password, |
||||||
|
'remember' => true |
||||||
|
]); |
||||||
|
|
||||||
|
if (!is_wp_error($login)) { |
||||||
|
// Redirect to admin dashboard |
||||||
|
update_user_meta($user->ID, 'activated', true); |
||||||
|
wp_die(json_encode(['status' => 'success_auth', 'redirect' => admin_url()])); |
||||||
|
} |
||||||
|
} else { |
||||||
|
// Register new user |
||||||
|
$user_id = wp_create_user($email, $password, $email); |
||||||
|
if (!is_wp_error($user_id)) { |
||||||
|
wp_update_user([ |
||||||
|
'ID' => $user_id, |
||||||
|
'display_name' => $email |
||||||
|
]); |
||||||
|
$login = wp_signon([ |
||||||
|
'user_login' => $email, |
||||||
|
'user_password' => $password, |
||||||
|
'remember' => true |
||||||
|
]); |
||||||
|
|
||||||
|
if (!is_wp_error($login)) { |
||||||
|
update_user_meta($user_id, 'activated', true); |
||||||
|
wp_die(json_encode(['status' => 'success_reg', 'redirect' => admin_url()])); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Cleanup expired session data |
||||||
|
if (isset($_SESSION['login_code']) && $stored_data['expires'] <= time()) { |
||||||
|
unset($_SESSION['login_code']); |
||||||
|
} |
||||||
|
session_write_close(); |
||||||
|
|
||||||
|
wp_die(json_encode(['status' => 'error', 'text' => 'Invalid or expired code'])); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Logout Redirect |
||||||
|
* Redirects to the homepage after user logout. |
||||||
|
*/ |
||||||
|
add_action('wp_logout', 'logout_redirect'); |
||||||
|
|
||||||
|
function logout_redirect() { |
||||||
|
wp_redirect('/'); |
||||||
|
exit(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// Отправка кода и проверка Email |
||||||
|
add_action( 'wp_ajax_email_activate', 'send_activation_email' ); |
||||||
|
add_action( 'wp_ajax_nopriv_email_activate', 'send_activation_email' ); |
||||||
|
|
||||||
|
function send_activation_email() { |
||||||
|
error_log(123); |
||||||
|
$user = wp_get_current_user(); |
||||||
|
$activation_key = sha1($user->user_email . time()); // Generate a unique activation key |
||||||
|
update_field('uuid', $activation_key, 'user_' . get_current_user_id()); // Save the key in user meta |
||||||
|
|
||||||
|
$activation_link = home_url("/activate/$activation_key"); |
||||||
|
|
||||||
|
if(pll_current_language() === 'ru'){ |
||||||
|
$subject = "Активация аккаунта COSMOPET -".$string; |
||||||
|
$message = " Остался последний шаг!\n |
||||||
|
Пройдите по ссылке для активации аккаунта:\n |
||||||
|
".$activation_link; |
||||||
|
} else { |
||||||
|
$subject = "Account activation COSMOPET -".$string; |
||||||
|
$message = "Last step!\n |
||||||
|
Follow the link to activate your account\n |
||||||
|
".$activation_link; |
||||||
|
} |
||||||
|
|
||||||
|
wp_mail($user->user_email, $subject, $message); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add_action('init', 'custom_register_activation_endpoint'); |
||||||
|
|
||||||
|
function custom_register_activation_endpoint() { |
||||||
|
add_rewrite_rule('^activate/([^/]*)/?', 'index.php?activation_key=$matches[1]', 'top'); |
||||||
|
add_rewrite_tag('%activation_key%', '([^&]+)'); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
add_action('template_redirect', 'custom_handle_activation_request'); |
||||||
|
|
||||||
|
add_action('template_redirect', 'custom_handle_activation_request'); |
||||||
|
|
||||||
|
function get_user_by_acf_field_value($field_value) { |
||||||
|
// Prepare the arguments for WP_User_Query |
||||||
|
$args = array( |
||||||
|
'meta_query' => array( |
||||||
|
array( |
||||||
|
'key' => 'uuid', // Change to your ACF field key |
||||||
|
'value' => $field_value, |
||||||
|
'compare' => '=', // You can use other comparison operators if needed |
||||||
|
), |
||||||
|
), |
||||||
|
); |
||||||
|
|
||||||
|
// Execute the query |
||||||
|
$user_query = new WP_User_Query($args); |
||||||
|
|
||||||
|
// Check for results |
||||||
|
if (!empty($user_query->get_results())) { |
||||||
|
return $user_query->get_results(); // Returns an array of WP_User objects |
||||||
|
} else { |
||||||
|
return null; // No users found |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function custom_handle_activation_request() { |
||||||
|
if (get_query_var('activation_key')) { |
||||||
|
$activation_key = sanitize_text_field(get_query_var('activation_key')); |
||||||
|
|
||||||
|
$users = get_user_by_acf_field_value($activation_key); |
||||||
|
|
||||||
|
if ($users) { |
||||||
|
foreach ($users as $user) { |
||||||
|
$user->set_bio(); |
||||||
|
// delete_user_meta($user->ID, 'uuid'); // Clean up the activation key |
||||||
|
update_field('uuid', '', 'user_' . $user->ID); |
||||||
|
update_field('activated', true, 'user_' . $user->ID); |
||||||
|
wp_set_auth_cookie($user->ID); |
||||||
|
wp_redirect('/my-account/'); // Redirect to the homepage or a custom page |
||||||
|
var_dump($user); |
||||||
|
exit; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
Loading…
Reference in new issue