Как получить все заголовки записей определенного типа?

21 сент. 2016 г., 13:07:34
Просмотры: 26.8K
Голосов: 11

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

2
Комментарии

Вопрос не очень понятен. Вы пытаетесь вернуть все заголовки записей для всех записей определенного типа записи? Это так?

Ahmed Fouad Ahmed Fouad
21 сент. 2016 г. 13:11:41

Извините! Да, именно так. Я создал пользовательский тип записи, добавил несколько записей этого типа и хочу вывести форму с элементом select, который позволит пользователю выбрать один из заголовков (они представляют проекты) для пожертвования.

Peter Turner Peter Turner
21 сент. 2016 г. 13:12:57
Все ответы на вопрос 4
7
17

Вы могли бы - и, на мой взгляд, должны бы - использовать API-функции для получения данных.

// запрос для вашего типа записи
$post_type_query  = new WP_Query(  
    array (  
        'post_type'      => 'your-post-type',  
        'posts_per_page' => -1  
    )  
);   
// нам нужен массив записей
$posts_array      = $post_type_query->posts;   
// создаем список с необходимой информацией
// ключ равен ID, значение - заголовок записи
$post_title_array = wp_list_pluck( $posts_array, 'post_title', 'ID' );
21 сент. 2016 г. 13:43:38
Комментарии

+1 за wp_list_pluck(). Я всегда про неё забываю...

FaCE FaCE
21 сент. 2016 г. 13:58:33

+1 за то, что познакомили с pluck! Как я раньше не знал об этой функции??

Chizzle Chizzle
8 сент. 2017 г. 04:36:09

+1 за однострочник... Однострочники всегда рулят!

Muhammad Osama Muhammad Osama
18 сент. 2021 г. 18:23:45

Будьте осторожны, это может легко перегрузить сайты с большим количеством записей. Использование WP_Query с 'posts_per_page' => -1 без достаточно строгих фильтров — это простой способ уронить сайт или исчерпать серверные ресурсы.

Bence Szalai Bence Szalai
22 авг. 2022 г. 12:55:55

Вы не ошибаетесь @sbnc.eu, но вопрос был в том, как получить все заголовки.

Nicolai Grossherr Nicolai Grossherr
26 авг. 2022 г. 15:10:58

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

Bence Szalai Bence Szalai
26 авг. 2022 г. 19:44:41

@sbnc.eu Спасибо – можете опубликовать решение для этого.

Nicolai Grossherr Nicolai Grossherr
7 сент. 2022 г. 09:53:14
Показать остальные 2 комментариев
4
11

Получить все заголовки записей определённого типа записи

// Функция, возвращающая заголовки записей из определённого типа записи в виде элемента select формы
// возвращает null, если результатов не найдено.

function output_projects_list() {
    global $wpdb;

    $custom_post_type = 'page'; // укажите slug вашего типа записи здесь

    // SQL запрос для получения всех заголовков записей
    $results = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_title FROM {$wpdb->posts} WHERE post_type = %s and post_status = 'publish'", $custom_post_type ), ARRAY_A );

    // Возвращаем null, если результатов нет
    if ( ! $results )
        return;

    // HTML для нашего select, выводящий заголовки записей в цикле
    $output = '<select name="project" id="project">';

    foreach( $results as $index => $post ) {
        $output .= '<option value="' . $post['ID'] . '">' . $post['post_title'] . '</option>';
    }

    $output .= '</select>'; // закрываем select элемент

    // возвращаем HTML
    return $output;
}

// Затем в вашем проекте просто вызовите функцию
// Там, где должен появиться select формы
echo output_projects_list();
21 сент. 2016 г. 13:21:45
Комментарии

Это излишне усложненная функция для задачи, которую можно легко решить с использованием API, предоставляемого WordPress в классе WP_Query. Ответ, предложенный @ialocin, гораздо лучше. Вам не следует использовать $wpdb для этого.

somebodysomewhere somebodysomewhere
22 сент. 2016 г. 22:07:38

Да, и в чём смысл этого комментария? :)

Ahmed Fouad Ahmed Fouad
22 сент. 2016 г. 23:19:07

@Brian Что делает другой ответ гораздо лучше? Технически этот вариант быстрее, так как вы получаете только нужные данные напрямую из MySQL. Другой ответ (более простой) загружает все данные в память, а затем изменяет их в PHP. Это создает дополнительную нагрузку на PHP. Оба варианта допустимы, но у каждого есть свои преимущества. Если вы знаете MySQL, то этот вариант вовсе не кажется излишне сложным. Он довольно прост.

JoeMoe1984 JoeMoe1984
5 янв. 2018 г. 22:21:10

Я согласен с @JoeMoe1984, эта функция не так проста, как в другом ответе... НО она НАМНОГО эффективнее с точки зрения использования памяти. SQL — это ГОРАЗДО лучшее место (чем wp_list_pluck(...)) для извлечения/фильтрации нужной информации. Да, она немного сложнее, но ваша система скажет вам за это спасибо...

mawalker mawalker
15 мар. 2018 г. 11:31:02
0

Для иерархического типа записи у нас есть встроенная функция:

wp_dropdown_pages( 
    [ 
        'post_type' => 'page',
        'echo'      => 1, 
        'name'      => 'wpse_titles', 
        'id'        => 'wpse-titles' 
    ] 
);

которая сгенерирует элемент select с заголовками записей и ID записи в качестве значения option.

Пример:

<select name='wpse_titles' id='wpse-titles'>
    <option class="level-0" value="1">AAA</option>
    <option class="level-0" value="2">BBB</option>
    <option class="level-1" value="3">&nbsp;&nbsp;&nbsp;CCC</option>
</select>

Из документации для wp_dropdown_pages() не совсем понятно, но это обёртка для get_pages(), которая также поддерживает её входные аргументы.

21 сент. 2016 г. 14:02:53
1

Я всегда делал подобные вещи с помощью get_posts и foreach, как показано ниже:

// Создаем аргументы для получения поста
$args = [
  'post_type'=>'custom-slug'
];

// Получаем массив объектов постов
$posts = get_posts($args);

// Начинаем формирование строки
$str = '<select>';
// Затем создаем option для каждого поста
foreach($posts as $key=>$post){
  $str .= '<option>'.$post->post_title.'</option>';
}
$str .= '</select>';
echo $str;
29 сент. 2016 г. 05:45:04
Комментарии

Это отлично работает, спасибо. Я пытаюсь добавить атрибут 'selected' к текущему сохранённому варианту, перепробовал много разных вариантов кода и в итоге пришёл к этому. Код позволяет обновлять опцию, но 'selected' не добавляется к нужному элементу. Можете подсказать, что я делаю не так?

$str .= '<option '. ($post == $value2 ? 'selected=selected' : '') .'>'. $post->post_title .'</option>';

Заранее благодарен за любые предложения

P.S. Извините, у меня не получается правильно добавить код, пробовал через обратные кавычки

Jo_pinkish Jo_pinkish
26 авг. 2017 г. 15:44:10