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

Вы могли бы - и, на мой взгляд, должны бы - использовать 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' );

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

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

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

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

Получить все заголовки записей определённого типа записи
// Функция, возвращающая заголовки записей из определённого типа записи в виде элемента 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();

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

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

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

Для иерархического типа записи у нас есть встроенная функция:
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"> CCC</option>
</select>
Из документации для wp_dropdown_pages()
не совсем понятно, но это обёртка для get_pages()
, которая также поддерживает её входные аргументы.

Я всегда делал подобные вещи с помощью 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;

Это отлично работает, спасибо. Я пытаюсь добавить атрибут 'selected' к текущему сохранённому варианту, перепробовал много разных вариантов кода и в итоге пришёл к этому. Код позволяет обновлять опцию, но 'selected' не добавляется к нужному элементу. Можете подсказать, что я делаю не так?
$str .= '<option '. ($post == $value2 ? 'selected=selected' : '') .'>'. $post->post_title .'</option>';
Заранее благодарен за любые предложения
P.S. Извините, у меня не получается правильно добавить код, пробовал через обратные кавычки
