TiA

Рейтинг
116
Регистрация
12.06.2009
yura5:
Добрый день!

Необходимо реализовать кеширование определенной кода в PHP - например, код вывода подобных постов <!--?php similar_posts(); ?--> (или другой какой-то) - с ним в 3 раза дольше грузится страница.
Соответственно как закешировать именно результат этого кода?
В интернете много перерыл инфы, но полезного почти ни чего нет.
Спасибо

Отдельные плагины кеширования не устраивают - они много места занимают.

Проще всего использовать встроенный механизм кеширования (функции 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

cscope:
Как удалить сразу все товары из wp? Плагином или командой в mysql.
Нужен проверенный метод, гуглить я сам умею.

Все зависит от того как именно они у вас хранятся.

Если вы используете 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");

}

});
Dana:
Я не Бог весть какой эксперт, но работала на нем.
И нужную структуру мне сделать не дало.
Например:
needles/woman/dress01.html
и
crochet/woman/dress01.html

Знатоки WP! Может движок сделать такое? Он у меня затыкнулся на подкатегории woman...

Основной проблемой в данном случае является то, что в 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-ов, я категорически не рекомендую, поскольку функции выборки будут работать неправильно.

Tison:
Здравствуйте, хочу добавить на свой сайт раздел в котором записи должны выводится по другому чем в остальных рубликах. Подойдет что-то вроде скопировать файл categories.php например создать categories2.php и в нем уже задать вид, как зарегистрировать и присвоить нужную категорию к categories2.php?

Это можно сделать, создав файлы с именами category-{псевдоним категории}.php или category-{ID категории}.php. Подробнее описано в документации: https://codex.wordpress.org/Category_Templates

Gigabajt:
Занимаюсь версткой я такой, пишу код, все дела... В общем, пришла в верхнюю часть тела мысль такая, а должен ли я нарезать картинки с макета самостоятельно или с этим дизигнер париться должен? И как научить его единые элементы, которых на сайте нет смысла разбивать, делать одним слоем, а не 1000 слоями, которые приходится все-равно сводить?😡😡😡

Нарезкой картинок из макета должен заниматься тот человек, который выполняет верстку. Связано это с тем, что дизайнер заранее не знает как вы будете верстать проект и что именно вам нужно.

У вас главная страница, например, генерируется сравнительно быстро - около 0.1-0.15 секунд. Это в принципе допустимо. Другое дело, что там еще 6.8 Мб различного рода файлов и под 160 запросов. Только две png-картинки с постерами - это уже 3 Мб. Если сервер подключен по 100 Мбит/с каналу и он весь ваш, то только на передачу этого всего счастья уйдет около 1 секунды.

Preci:
Здравствуйте!

Установил плагин Query Monitor и побегал по страницам сайта. В результате вылезла такая картина: в среднем запросы к бд занимают 0.05 сек., а генерация страницы при этом идет от 0.3 до 0.6сек. для оптимизации php у меня стоит xCache.

Вопрос: Такая долгая генерация страниц является следствием медленного php и мне надо разбираться с его конфигом / оптимизаторами. Или плагин показывает какую-то другую информацию о времени запроса?

В первую очередь нужно посмотреть сколько времени выполняются MySQL-запросы. Описанный вами плагин https://ru.wordpress.org/plugins/query-monitor/ эту информацию должен показывать (колонка Time).

Для кардинального ускорения генерации страниц можно использовать плагины для кеширования. Я предпочитаю Cachify, WP-FFPC или Hyper Cache. Из более сложных есть W3C Total Cache.

Maxim-KL:
Всем доброго времени суток и заранее спасибо за полезные советы. Ситуация такая:

Необходимо организовать конкурс фоторабот на WP в одном посте. Что бы было полноценное голосование и один человек мог проголосовать только один раз. Если честно я совсем слабо себе представляю как такое сделать так как раньше не приходилось с подобным сталкиваться. Даже не знаю использовать какой то плагин или что...?

Буду очень благодарен если укажите в какую сторону стоит двигаться.🍿

Я в основном для решения подобного рода задач использую дополнительные мета-поля записи и AJAX-запросы:


<?php
add_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>
Всего: 800