Як отримати всі заголовки публікацій певного типу публікації?


9

Я хотів би використовувати заголовки в обраному елементі у формі, що перегукується з клієнтом. Який був би найкращий спосіб зробити це?


Питання не дуже зрозуміле. Ви намагаєтесь повернути всі заголовки публікацій для всіх публікацій під певним типом публікації? Це так?
Ахмед Фуад

Вибачте! Так, я створив спеціальний тип публікації, створив декілька публікацій такого типу, і я хочу повторити форму з елементом вибору, який дозволяє користувачеві вибрати один із заголовків (Вони представляють проекти), які потрібно пожертвувати.
Пітер Тернер

Відповіді:


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
@Brian Що 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(). Я завжди забуваю про те, що ...
ПІД

+1 за те, що я познайомив мене з планетом! Як я цього раніше не бачив ??
Чізл

5

Для типу ієрархічного посту у нас є вбудований:

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

який генерує елемент вибору із заголовками публікацій та ідентифікатором поста як значенням параметра.

Приклад:

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