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 |
||||
|
||||
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