Gerga

Gerga
Рейтинг
94
Регистрация
02.08.2015

Тарасов Роман, функцию можно немного оптимизировать, избавиться от $lib массива и связанных с ним действий. Не обязательно держать все буквы алфавитов, можно выводить нужною букву только при необходимости.


/**
* Функция возвращает алфавитный указатель указанной категории
* @version 2.0
* @param int $cat - id категори
**/
function get_category_alphabet(int $cat = 1) {
$posts = get_posts([ 'orderby' => 'title',
'order' => 'ASC',
'category' => $cat,
'numberposts' => 999,
]);

$prev_letter = $out = '';

foreach ($posts as $post) {
if (!$post->post_title) {
continue;
}

$letter = mb_strtoupper(mb_substr($post->post_title, 0, 1));

if ($letter != $prev_letter) {
$out .= '<li><span class="letter">' . $letter . '</span>';
$prev_letter = $letter;
}

$out .= '<a href="' . get_permalink($post->ID) . '">' . $post->post_title . '</a>';
}

return '<ul class="alphabet">' . $out . '</ul>';
}

echo get_category_alphabet(1); // тут вместо 1 указываете id нужной категории


---------- Добавлено 06.12.2018 в 09:59 ----------

Без учета комментов, размер функции почти в 2 раза уменьшился. Избавились от массива $lib, теперь не нужно вводить в программу все буквы, и от 1 цикла.
SeVlad:
ИМХО куда элегантней и безопаснее

да, так и есть :) С таксономией/ПП распределение не скрыто от администратора, возможно именно это и нужно. Даже если хуком save_post ставить терм/произвольное значение, все равно админу нагляднее будет.

SeVlad:
А в твоём решении не всё однозначно с нагрузкой.

Да, в моем решении группировка постоянно выполняется, в твоем решении только 1 раз будет установлен терм или произвольное значение. Это лучше.

---------- Добавлено 05.12.2018 в 17:24 ----------

SeVlad:
А обновить посты можно и массово).

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

SeVlad:
Если это нужно то произвольные поля или таксономия будет куда логичнее и проще.

так для каждой записи нужно ставить букву, а это уже сделано. Меньше движения получится.

---------- Добавлено 05.12.2018 в 16:49 ----------

Еще плюс в первом подходе в том, что если статьи добавлены пропадает необходимость в их редактировании для установки нужной буквы. Опять экономия на движении.

Sitealert:
Так мы получим выборку по названиям записей.

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

Тарасов Роман:
Думаю должно быть лучше, чем с плагином

Если я вас правильно понял, будет лучше.

DominantBlogge, как я понял, этот файл

DominantBlogge:
http://ngrinko.com/wp-content/cache/...47464ba1e7.css

загружается на твоем сайте и домен сайта не ngrinko.com ?

Пардус Упячкин:
Как оценить верстальщика?

оценивайте на соответствие техническому заданию. Например, если в ТЗ вы не требуете кроссбраузерности, она не обязательно будет реализована.

Пардус Упячкин:
Какие вопросы задать перед тем как отдать проект в работу?

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

Пардус Упячкин:
Я верстку знаю в общих чертах (могу что то простенькое сверстать)
а вот уже всякие там шаблонизаторы и SASS для меня темный лес.

Вам не обязательно вникать в реализацию. Вы можете использовать любый объект в этом мире не вникая в детали реализации, так же и с версткой.

pozitiFFF:
Сейчас уже смотрю в сторону сайтов фрилансеров, может за тыс. 10 получится сделать всё как я хочу чужими, но умелыми руками)
А в дальнейшем когда запущу уже в случае чего и дорабатывать самому.

Да. Так обычно и делается.

Supersheva, в теории нужно следать за сменой статуса заказа. Если статус заказа был установлен completed, значит для товаров из списка заказа нужно уменьшить количество запаса ровно на столько, сколько указано в заказе. Пример:


function woo_change_product_quantity($order_id) {
$order = wc_get_order($order_id);

foreach ($order->get_items() as $item_id => $item_data) {
$product = $item_data->get_product();

$quantity = $product->get_stock_quantity() - $item_data->get_quantity();

wc_update_product_stock($product->get_id(), $quantity);
}
}

add_action('woocommerce_order_status_completed', 'woo_change_product_quantity');

Charli, как заметил burunduk, кешируйте результат выборки на сутки/неделю/месяц. Каждый запрос фильтра проверяйте на наличие и актуальность кеша. Если все ок, отдавайте результат из кеша. Если нет, делайте запрос к БД, сохраняйте результат в кеш и отдавайте клиенту. Конечно если эти махинации действительно необходимы.

Тарасов Роман, смотрите как можно сделать. Создаете массив с буквами алфавита:


$lib = [ 'A' => '',
'B' => '',
'C' => '',
'W' => '',
'...' => '',
'А' => '',
'Б' => '',
'В' => '',
];

затем получите все записи нужной категории и пройдитесь по этим записям сохрания запись в $lib нужной буквы:


$posts = get_posts([ 'category' => 1,
'numberposts' => 999,
]);

foreach ($posts as $post) {
$letter = strtoupper(mb_substr($post->post_title, 0, 1));

if (isset($lib[$letter])) {
$lib[$letter] .= '<li><a href="' . get_permalink($post->ID) . '">' . $post->post_title . '</a>';
}
}

теперь можно выводить алфавитный указатель:


$out = '';

foreach ($lib as $key => $value) {
if (!$value) {
continue;
}

$out .= '
<div class="wrapper-letter">
<span class="letter">' . $key . '</span>
<ul>' . $value . '</ul>
</div>
';

}

echo $out;

Если все это дело, для многоразового использования, оформить в функцию, будет так выглядеть:



/**
* Функция возвращает алфавитный указатель указанной категории
* @param int $cat - id категори
**/

function get_category_alphabet(int $cat = 1) {
$lib = [ 'A' => '',
'B' => '',
'C' => '',
'W' => '',
'...' => '',
'А' => '',
'Б' => '',
'В' => '',
];

$posts = get_posts([ 'category' => $cat,
'numberposts' => 999,
]);

foreach ($posts as $post) {
$letter = strtoupper(mb_substr($post->post_title, 0, 1));

if (isset($lib[$letter])) {
$lib[$letter] .= '<li><a href="' . get_permalink($post->ID) . '">' . $post->post_title . '</a>';
}
}

$out = '';

foreach ($lib as $letter => $value) {
if (!$value) {
continue;
}

$out .= '
<div class="wrapper-letter">
<span class="letter">' . $letter . '</span>
<ul>' . $value . '</ul>
</div>
';
}

return $out;
}

echo get_category_alphabet(1); // тут вместо 1 указываете id нужной категории
Всего: 811