gikami
@gikami
web программист

Как обновить menu_order порядок в WP у всех дочерних записей, при изменении порядка одной из них?

Есть основная запись и дочерние (Пример иерархии, главы у книг).
Пользователь переносит к примеру 3 главу из 5 на позицию первой. При этом получается, что старая 1 глава имеет позицию 1 и 3 глава тоже позицию 1.
Приведенный ниже код, обновляет порядок всех глав исходя из позиции глав.
Можно ли как то в Wordpress или все же чистым sql, обновить позиции всех дочерних записей одним запросом, при этом обойти проблему одинаковых позиций?
//Изменение позиции конкретной главы
$update_post = array(
	'ID' => $glav_id,
	'post_type' => 'book',
	'menu_order' => $position,
);
wp_update_post( wp_slash($update_post) );

//Обновление порядка всех глав (Сортировка при этом идет по столбцу menu_order и получается ошибочная логика, так как есть одинаковые позиции )
$wpdb->query( 'SELECT @i:=-1' );
$result = $wpdb->query("UPDATE {$wpdb->posts} SET menu_order = ( @i:= @i+1 ) WHERE post_parent = '{$post->post_parent}' AND post_author = '{$post->post_author}' ORDER BY menu_order ASC;");

Большое спасибо заранее за идеи и помощь. В сети я не нашел ответа на данный вопрос и в основном это плагины или на стороне админки. Думаю ответ будет полезен всем.
  • Вопрос задан
  • 133 просмотра
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
На чистом SQL задача решается несложным запросом.

Пример.

Исходная структура:
CREATE TABLE test (entity INT,    -- некая строка в структуре
                   position INT); -- её позиция при сортировке


Исходные данные для изменения:

@from - номер позиции элемента, который надо куда-то переместить;
@to - номер позиции, на которую его надо переместить.

Запрос:
UPDATE test
SET position := CASE WHEN position = @from 
                     THEN @to
                     ELSE position + SIGN(@from - @to)
                     END
WHERE position BETWEEN LEAST(@from, @to) AND GREATEST(@from, @to);


DEMO fiddle.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы