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

9

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

Питер Тернер
источник
Вопрос не очень понятен. Вы пытаетесь вернуть все заголовки сообщений для всех сообщений определенного типа? Это правильно?
Ахмед Фуад
Сожалею! Да, именно так, я создал пользовательский тип поста, создал несколько постов этого типа, и я хочу отобразить форму с элементом select, который позволяет пользователю выбрать один из заголовков (они представляют проекты) для пожертвования.
Питер Тернер

Ответы:

11

Запросить все заголовки сообщений определенного типа

// Function that returns post titles from specific post type as form select element
// returns null if found no results.

function output_projects_list() {
    global $wpdb;

    $custom_post_type = 'page'; // define your custom post type slug here

    // A sql query to return all post titles
    $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 );

    // Return null if we found no results
    if ( ! $results )
        return;

    // HTML for our select printing post titles as loop
    $output = '<select name="project" id="project">';

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

    $output .= '</select>'; // end of select element

    // get the html
    return $output;
}

// Then in your project just call the function
// Where you want the select form to appear
echo output_projects_list();
Ахмед Фуад
источник
3
Это слишком сложная функция для чего-то, что можно легко сделать с помощью API, который WordPress предоставляет в классе WP_Query. Ответ, предоставленный @ialocin, намного лучше. Вам не нужно $ wpdb для этого.
somebodysomewhere
Да и какой смысл комментировать? :)
Ахмед Фуад
1
@ Брайан Как far betterнасчет другого ответа? Технически это быстрее, так как вы получаете только те данные, которые вам нужны из mysql. Другой ответ (более простой ответ) захватывает все данные в память, а затем изменяет их в PHP. Это больше работы для PHP. Оба приемлемы, но у каждого есть свои сильные стороны. Если вы знаете mysql, то это совсем не сложно. Это довольно просто.
JoeMoe1984
Я согласен с @ JoeMoe1984, эта функция не так проста, как другой ответ ... НО она намного эффективнее с точки зрения памяти. SQL гораздо лучше (чем wp_list_pluck (...)) для уменьшения / извлечения ценной информации. Да, это немного сложнее, но ваша система поблагодарит вас за это ...
mawalker
13

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

// query for your post type
$post_type_query  = new WP_Query(  
    array (  
        'post_type'      => 'your-post-type',  
        'posts_per_page' => -1  
    )  
);   
// we need the array of posts
$posts_array      = $post_type_query->posts;   
// create a list with needed information
// the key equals the ID, the value is the post_title
$post_title_array = wp_list_pluck( $posts_array, 'post_title', 'ID' );
Nicolai
источник
2
+1 за wp_list_pluck(). Я всегда забываю об этом ...
FaCE
+1 за то, что познакомил меня с этим! Как я не видел это раньше?
Chizzle
5

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

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

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

Пример:

<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()и также поддерживает входные аргументы.

birgire
источник
0

То, как я всегда делал такие вещи, использует get_postsи foreachкак-то ниже:

// Create our arguments for getting our post
$args = [
  'post_type'=>'custom-slug'
];

// we get an array of posts objects
$posts = get_posts($args);

// start our string
$str = '<select>';
// then we create an option for each post
foreach($posts as $key=>$post){
  $str .= '<option>'.$post->post_title.'</option>';
}
$str .= '</select>';
echo $str;
Тим Робертс
источник
Это работает хорошо, спасибо. Я пытаюсь добавить «выбранный» к сохраненной в данный момент опции, я пробовал много разных фрагментов кода и, наконец, пришел к этому, что позволяет мне обновить опцию, но «выбранный» не добавляется к правильному. Есть указания на то, что я делаю не так? `$ str. = '<опция'. ($ post == $ value2? 'selected = selected': ''). '>'. $ post-> post_title. '</ option>'; `Большое спасибо за любые предложения. ps Извините, я, кажется, неправильно добавляю код, пробовал обратные
ссылки