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


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' );

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


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 Извините, я, кажется, неправильно добавляю код, пробовал обратные
— ссылки
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.