Как отсортировать (orderby) запрос, выполненный с помощью функции шаблона, перед циклом ‘foreach’?

Вопрос или проблема

Как я могу отсортировать массив элементов, получаемых в результате запроса, выполненного шаблонной функцией, непосредственно перед тем, как начинается вывод в цикле foreach? Я хотел упорядочить свои элементы по заголовку поста. Вот мой код:

<?php
$show_subproperties = apushome_get_config('show_property_sub', true);
if (!$show_subproperties) {
    return;
}
$post = get_post();
$author_id = $post->post_author;
$subproperties = Realia_Post_Type_Property::get_properties($author_id, "publish", get_the_ID()); ?>

<?php if (is_array($subproperties) && !empty($subproperties)) : ?>
    <div class="property-subproperties">
        <h3><?php echo esc_html__('Модули Индивидуальные', 'apushome'); ?></h3>
        <div class="clearfix">
            <?php foreach ($subproperties as $subproperty) : ?>
            <div class="col-md-4 col-lg-3 col-sm-6 col-xs-12 modulos-i">
                <?php echo Realia_Template_Loader::load('properties/box', array('property' => $subproperty)); ?>
            </div>
            <?php endforeach; ?>
        </div><!-- /.row -->
    </div><!-- /.subproperties -->
<?php endif ?>

Не зная, что делает и что возвращает Realia_Post_Type_Property::get_properties(), на этот вопрос немного сложно ответить. Но, по сути, вам нужно отсортировать массив с помощью PHP.

Если Realia_Post_Type_Property::get_properties() не позволяет вам получить отсортированный список постов, вашим лучшим вариантом, вероятно, будет использование wp_list_sort().

Эта функция сортирует список объектов на основе одного или нескольких аргументов orderby. Предполагая, что $subproperties — это массив объектов WP_Post, вы сможете сделать следующее:

$subproperties = wp_list_sort( $subproperties, array( 'post_title' => 'DESC' ) );

Я нашел довольно простое решение, как только я наконец понял, что $subproperties — это просто простой массив:

            <?php asort($subproperties);
        foreach ($subproperties as $subproperty) : ?>
            <div class="col-md-4 col-lg-3 col-sm-6 col-xs-12 modulos-i">
                <?php echo Realia_Template_Loader::load('properties/box', array('property' => $subproperty)); ?>
            </div>
            <?php endforeach; ?>
        </div><!-- /.row -->
    </div><!-- /.subproperties -->

Ответ или решение

Ваша задача заключается в сортировке массива элементов, который вы получаете из функции-шаблона, перед тем как выводить его в цикле foreach. Рассмотрим, как эффективно выполнить эту задачу, используя правильные методы и подходы.

Шаг 1: Понимание структуры данных

Вы получили массив $subproperties, который, по всей видимости, является массивом объектов типа WP_Post. Хотя вы упомянули, что функции Realia_Post_Type_Property::get_properties() результаты могут варьироваться, предположим, что элементы массива представляют собой объекты WordPress.

Шаг 2: Сортировка массива

Для сортировки массива объектов по определённому полю, в вашем случае это post_title, существует несколько подходов. Один из наиболее удобных методов в WordPress — использование функции wp_list_sort(), которая предназначена для сортировки массива объектов на основе заданных критериев.

Вот как можно модифицировать ваш код для сортировки по заголовкам постов:

<?php
$show_subproperties = apushome_get_config('show_property_sub', true);
if (!$show_subproperties) {
    return;
}

$post = get_post();
$author_id = $post->post_author;
$subproperties = Realia_Post_Type_Property::get_properties($author_id, "publish", get_the_ID()); 

if (is_array($subproperties) && !empty($subproperties)) {
    // Сортируем массив по заголовку поста
    $subproperties = wp_list_sort($subproperties, 'post_title', 'ASC'); // 'ASC' для сортировки по возрастанию, используйте 'DESC' для убывания

    ?>
    <div class="property-subproperties">
        <h3><?php echo esc_html__('Модули Индивидуальные', 'apushome'); ?></h3>
        <div class="clearfix">
            <?php foreach ($subproperties as $subproperty) : ?>
                <div class="col-md-4 col-lg-3 col-sm-6 col-xs-12 modulos-i">
                    <?php echo Realia_Template_Loader::load('properties/box', array('property' => $subproperty)); ?>
                </div>
            <?php endforeach; ?>
        </div><!-- /.row -->
    </div><!-- /.subproperties -->
    <?php
}
?>

Объяснение кода

  1. Получение данных: Мы получаем массив подмодулей, используя вашу функцию get_properties().
  2. Проверка массива: Убедимся, что мы работаем с массивом и что он не пуст.
  3. Сортировка: Мы используем wp_list_sort(), передавая ему массив $subproperties, поле post_title, по которому нужно сортировать, и порядок сортировки (возрастание или убывание).
  4. Вывод элементов: В цикле foreach мы выводим отсортированные элементы на экран.

Альтернативный подход

Если по каким-то причинам вам не подходит использовать wp_list_sort(), существует возможность использовать встроенную функцию PHP usort(). Однако в этом случае вам потребуется написать собственную функцию для сравнения:

usort($subproperties, function($a, $b) {
    return strcmp($a->post_title, $b->post_title); // Для сортировки по заголовку
});

Этот метод также эффективен, однако wp_list_sort() уже оптимизирован для использования в WordPress и предоставляет дополнительные возможности, такие как сортировка по нескольким полям.

Заключение

Сортировка массива перед выводом в foreach — это простая, но необходимая задача для упорядочивания ваших данных. Использование функций WordPress, таких как wp_list_sort(), делает этот процесс более управляемым и эффективным. Обязательно выберите подходящий метод сортировки в зависимости от ваших требований и структуры данных.

Оцените материал
Добавить комментарий

Капча загружается...