Проще всего использовать встроенный механизм кеширования (функции wp_cache_add, wp_cache_set, wp_cache_get и прочие). Подробно они описаны в документации: https://codex.wordpress.org/Class_Reference/WP_Object_Cache Обратите внимание, что для полноценной работы необходимо подключить модуль/плагин для объектного кеширования.
В качестве ключа можно использовать ID записи или рубрики с префиксом.
Я добавил проверку элемента, который вызвал событие. Это помогает исключить срабатывание при всплывании. Подробнее в документации: https://learn.javascript.ru/event-bubbling
Все зависит от того как именно они у вас хранятся.
Если вы используете WooCommerce, то можно попробовать использовать плагин: https://ru.wordpress.org/plugins/woocommerce-remove-all-products/ Можно также и через MySQL:
DELETE relations.*, taxes.*, terms.* FROM wp_term_relationships AS relations INNER JOIN wp_term_taxonomy AS taxes ON relations.term_taxonomy_id=taxes.term_taxonomy_id INNER JOIN wp_terms AS terms ON taxes.term_id=terms.term_id WHERE object_id IN (SELECT ID FROM wp_posts WHERE post_type='product'); DELETE FROM wp_postmeta WHERE post_id IN (SELECT ID FROM wp_posts WHERE post_type = 'product'); DELETE FROM wp_posts WHERE post_type = 'product';
Вообще что-то удалять через SQL - это не лучшее решение, но на больших объемах данных оно может выручить.
Это делается достаточно просто:
$(".closepp, .overlaypp").click(function(e) { if (e.target == this) { $(".panelpp, .overlaypp").animate({opacity: 'hide'}, "slow"); }});
Основной проблемой в данном случае является то, что в WP по-умолчанию все slug-и (псевдонимы, названия в URL, очень грубо говоря) должны быть уникальными. Ограничение это можно понять. Если вы, например, решите перенести подрубрику wooman из crochet в needles, то получится, что по одному и тому же адресу needles/woman/dress01.html будут уже две записи и две рубрики.
Для решения этой коллизии можно использовать несколько решений. Первое и самое очевидное - это хранить для каждой записи свою ссылку в поле с доп. информацией. Именно по такому принципу работает плагин https://ru.wordpress.org/plugins/custom-permalinks/ и прочие схожие (https://wordpress.org/plugins/simple-urls/ , например). В этом случае уникальной должна быть только вся ссылка, а не отдельные ее части.
Второе решение - это просто добавить к slug-ам ID категорий и записи. В итоге получится ссылка вида 2-needles/4-woman/6-dress01.html. В этом случае при наполнении нужно будет создать в базе данных таблицу со старой и новой ссылкой, а также написать небольшой плагин, который будет автоматически перенаправлять со старой страницы на новую, если движок по каким-то причинам выдал 404 ошибку. Впрочем, это можно реализовать и с помощью огромного количества уже готовых плагинов для редиректа.
Вариант, когда просто убирается проверка на уникальность slug-ов, я категорически не рекомендую, поскольку функции выборки будут работать неправильно.
Это можно сделать, создав файлы с именами category-{псевдоним категории}.php или category-{ID категории}.php. Подробнее описано в документации: https://codex.wordpress.org/Category_Templates
Нарезкой картинок из макета должен заниматься тот человек, который выполняет верстку. Связано это с тем, что дизайнер заранее не знает как вы будете верстать проект и что именно вам нужно.
У вас главная страница, например, генерируется сравнительно быстро - около 0.1-0.15 секунд. Это в принципе допустимо. Другое дело, что там еще 6.8 Мб различного рода файлов и под 160 запросов. Только две png-картинки с постерами - это уже 3 Мб. Если сервер подключен по 100 Мбит/с каналу и он весь ваш, то только на передачу этого всего счастья уйдет около 1 секунды.
В первую очередь нужно посмотреть сколько времени выполняются MySQL-запросы. Описанный вами плагин https://ru.wordpress.org/plugins/query-monitor/ эту информацию должен показывать (колонка Time).
Для кардинального ускорения генерации страниц можно использовать плагины для кеширования. Я предпочитаю Cachify, WP-FFPC или Hyper Cache. Из более сложных есть W3C Total Cache.
Я в основном для решения подобного рода задач использую дополнительные мета-поля записи и AJAX-запросы:
<?phpadd_action('wp_ajax_nopriv_post_rating', 'tw_post_rating');add_action('wp_ajax_post_rating', 'tw_post_rating');function tw_post_rating(){ if (isset($_POST['rating_vote']) and isset($_POST['nonce']) and wp_verify_nonce($_POST['nonce'], 'ajax-nonce')) { $timebeforerevote = 120; $ip = $_SERVER['REMOTE_ADDR']; $post_id = intval($_POST['post_id']); $meta_IP = get_post_meta($post_id, "rating_IP"); if (is_array($meta_IP) and isset($meta_IP[0])) $rating_IP = $meta_IP[0]; else $rating_IP = array(); if (in_array($ip, array_keys($rating_IP))) { $time = $rating_IP[$ip]; $now = time(); if (round(($now - $time) / 60) < $timebeforerevote) { echo json_encode(array('error' => 'Вы уже голосовали')); exit(); } } $rating_vote = intval($_POST['rating_vote']); if ($rating_vote > 5 or $rating_vote < 0) exit(); $rating_value = get_post_meta($post_id, "rating_value", true); if (empty($rating_value)) { delete_post_meta($post_id, "rating_value"); add_post_meta($post_id, "rating_value", '0'); $rating_value = 0; } $rating_votes = get_post_meta($post_id, "rating_votes", true); if (empty($rating_votes)) { delete_post_meta($post_id, "rating_votes"); add_post_meta($post_id, "rating_votes", '0'); $rating_votes = 0; } $rating_sum = get_post_meta($post_id, "rating_sum", true); if (empty($rating_sum)) { delete_post_meta($post_id, "rating_sum"); add_post_meta($post_id, "rating_sum", '0'); $rating_sum = 0; } $rating_IP[$ip] = time(); $rating_sum = $rating_sum + $rating_vote; $rating_votes++; $rating_value = round($rating_sum/$rating_votes); update_post_meta($post_id, "rating_IP", $rating_IP); update_post_meta($post_id, "rating_votes", $rating_votes); update_post_meta($post_id, "rating_value", $rating_value); update_post_meta($post_id, "rating_sum", $rating_sum); $result = array( 'rating' => intval($rating_value), 'votes' => intval($rating_votes) ); echo json_encode($result); } exit(); }?>
Поместить его можно в functions.php
В шаблоне это можно использовать примерно так:
<?php$rating = get_post_meta(get_the_ID(), 'rating_value', true);if (empty($rating)) { delete_post_meta(get_the_ID(), 'rating_value'); add_post_meta(get_the_ID(), 'rating_value', '0'); $rating = 0;}?><div class="rating"><?php for ($i = 0; $i < 4; $i++) { ?><span<?php if ($rating > $i) echo ' class="active"'; ?>></span><?php } ?></div><script type="text/javascript">jQuery(function($){ var rating = parseInt('<?php echo $rating; ?>'); $('.rating > span').each(function(i){ var num = i+1; $(this).click(function(){ $.ajax({ type: "POST", data: { action: 'post_rating', rating_vote: num, nonce: '<?php echo wp_create_nonce('ajax-nonce'); ?>', post_id: '<?php the_ID(); ?>' }, url: '<?php echo admin_url('admin-ajax.php'); ?>', dataType: 'json', success: function(data){ if (data.error) alert(data.error); if (data.rating) { rating = data.rating; $('.rating > span').removeClass('active'); $('.rating > span:lt(' + parseInt(data.rating) + ')').addClass('active'); } } }); }); $(this).hover( function(){ $('.rating > span').removeClass('active'); $('.rating > span:lt(' + num + ')').addClass('active'); }, function(){ } ); }); $('.rating').hover( function(){ }, function(){ $('.rating > span').removeClass('active'); $('.rating > span:lt(' + rating + ')').addClass('active'); } );});</script>