Вопрос или проблема
Как я могу изменить этот код
$posts = get_posts(array('post_type'=> 'lesson', 'post_status'=> 'publish', 'suppress_filters' => false, 'posts_per_page'=>-1));
//здесь вы добавляете HTML выпадающего списка, добавьте что-то вроде
echo '<p>Выберите урок: <select name="_dappcf_i_dropdown" class="widefat" style="width:170px" >';
foreach ($posts as $post) {
echo '<option value="', $post->ID, '"'; if ($my_dropdown == $post->ID){echo ' selected="selected"';} echo '>'.$post->post_title.'</option>';
}
echo '</select>';
}
чтобы вывести заголовок выбранного поста в шаблоне страницы с URL выбранного поста (заголовок должен быть ссылкой)?
Спасибо заранее
Супер короткая версия:
Замените $post->post_title
на get_permalink($post->ID)
.
Короткая версия:
Добавьте фильтр в ваш текущий код, где вы выводите post_title
.
$posts = get_posts(array('post_type'=> 'lesson', 'post_status'=> 'publish', 'suppress_filters' => false, 'posts_per_page'=>-1));
//здесь вы добавляете HTML выпадающего списка, добавьте что-то вроде
echo '<p>Выберите урок: <select name="_dappcf_i_dropdown" class="widefat" style="width:170px" >';
foreach ($posts as $post) {
echo '<option value="', $post->ID, '"';
if ($my_dropdown == $post->ID){echo ' selected="selected"';}
echo '>'.
apply_filters('filter_list_cpt', $post->post_title, $post).
'</option>';
}
echo '</select>';
Где-то в вашем functions.php
или файле плагина:
function filter_list_cpt($title, $cpt) {
return sprintf(__('%1$s [%2$s]', 'my_textdomain'), $title, get_permalink($cpt->ID));
}
add_filter('list_cpt', 'filter_list_cpt', 10, 2);
Но почему останавливаться на этом? Давайте улучшим предоставленный код и рассмотрим его с точки зрения WordPress.
Лучший подход
WordPress имеет свои собственные вспомогательные функции для получения списка, например, страниц. Вместо того чтобы просто писать код, давайте попробуем скопировать и переписать эту функцию под наши нужды. Я называю это: my_dropdown_post_type
function my_dropdown_post_type( $post_type="lesson", $args="" ) {
$defaults = array(
'depth' => 0, 'child_of' => 0,
'selected' => 0, 'echo' => 1,
'name' => "{$post_type}_id", 'id' => '',
'class' => '',
'show_option_none' => '', 'show_option_no_change' => '',
'option_none_value' => '',
'value_field' => 'ID',
'post_type' => $post_type
);
$r = wp_parse_args( $args, $defaults );
$cpt = get_posts( $r );
$output="";
if ( ! empty( $cpt ) ) {
$class="";
if ( ! empty( $r['class'] ) ) {
$class = " class="" . esc_attr( $r["class'] ) . "'";
}
$output = "<select name="" . esc_attr( $r["name'] ) . "'" . $class . " id='" . esc_attr( $r['id'] ) . "'>\n";
if ( $r['show_option_no_change'] ) {
$output .= "\t<option value=\"-1\">" . $r['show_option_no_change'] . "</option>\n";
}
if ( $r['show_option_none'] ) {
$output .= "\t<option value=\"" . esc_attr( $r['option_none_value'] ) . '">' . $r['show_option_none'] . "</option>\n";
}
$output .= walk_page_dropdown_tree( $cpt, $r['depth'], $r );
$output .= "</select>\n";
}
$html = apply_filters( 'wp_dropdown_pages', $output, $r, $cpt );
if ( $r['echo'] ) {
echo $html;
}
return $html;
}
Затем мы применяем наш list_pages
фильтр
function filter_list_cpt($title, $cpt) {
if ($cpt->post_type == 'lesson')
return sprintf(__('%1$s [%2$s]', 'my_textdomain'), $title, get_permalink($cpt->ID));
return $title;
}
add_filter('list_pages', 'filter_list_cpt', 10, 2);
В конце мы можем вызвать нашу функцию my_dropdown_post_type
как любую другую базовую функцию WP:
my_dropdown_post_type(
'lesson',
array(
'selected' => $my_dropdown,
'post_status'=> 'publish',
'suppress_filters' => false,
'posts_per_page'=>-1
)
);
$posts = get_posts(array('post_type'=> 'lesson', 'post_status'=> 'publish', 'suppress_filters' => false, 'posts_per_page'=>-1));
// Проверьте, выбран ли урок
if (!empty($my_dropdown)) {
// Найдите выбранный урок по ID
$selected_lesson = get_post($my_dropdown);
// Проверьте, существует ли выбранный урок
if ($selected_lesson) {
// Выведите заголовок выбранного урока как ссылку
echo '<p>Выбранный урок: <a href="' . get_permalink($selected_lesson) . '">' . esc_html($selected_lesson->post_title) . '</a></p>';
}
}
// Отобразить выпадающий список
echo '<p>Выберите урок: <select name="_dappcf_i_dropdown" class="widefat" style="width:170px">';
foreach ($posts as $post) {
echo '<option value="' . $post->ID . '"';
if ($my_dropdown == $post->ID) {
echo ' selected="selected"';
}
echo '>' . $post->post_title . '</option>';
}
echo '</select>';
Этот код отобразит заголовок выбранного урока как ссылку в шаблоне страницы, когда урок будет выбран из выпадающего списка.
Ответ или решение
Чтобы изменить код таким образом, чтобы при выборе записи в выпадающем списке отображался ее заголовок в виде ссылки на соответствующий пост, нам нужно будет внести некоторые изменения в существующий код. Мы добавим логику для отображения URL выбранного урока. Подход, описанный ниже, обеспечивает функциональность на уровне, удобном для пользователя.
Шаг 1: Получение Постов
Для начала мы получим список постов определенного типа (в данном случае, "lesson"). Это делается с помощью функции get_posts()
, как вы уже указали:
$posts = get_posts(array(
'post_type' => 'lesson',
'post_status' => 'publish',
'suppress_filters' => false,
'posts_per_page' => -1
));
Шаг 2: Отображение Выбранного Урока
Следующий шаг состоит в том, чтобы проверить, выбран ли урок, и если да, получить его заголовок и URL. Для этого мы используем функцию get_post()
на основе ID выделенного урока (также мы предполагаем, что переменная $my_dropdown
содержит ID выбранного урока).
// Проверяем, выбран ли урок
if (!empty($my_dropdown)) {
// Получаем объект выбранного урока
$selected_lesson = get_post($my_dropdown);
// Проверяем, существует ли выбранный урок
if ($selected_lesson) {
// Выводим заголовок урока как ссылку
echo '<p>Выбранный урок: <a href="' . get_permalink($selected_lesson) . '">' . esc_html($selected_lesson->post_title) . '</a></p>';
}
}
Шаг 3: Отображение Выпадающего Списка
Теперь мы можем построить выпадающий список, используя цикл foreach
, чтобы пройтись по всем постам, и указать, выбран ли текущий пост:
echo '<p>Выберите урок: <select name="_dappcf_i_dropdown" class="widefat" style="width:170px">';
foreach ($posts as $post) {
echo '<option value="' . $post->ID . '"';
if ($my_dropdown == $post->ID) {
echo ' selected="selected"';
}
echo '>' . esc_html($post->post_title) . '</option>';
}
echo '</select></p>';
Итог: Полный Код
Полный пример кода выглядит следующим образом:
$posts = get_posts(array(
'post_type' => 'lesson',
'post_status' => 'publish',
'suppress_filters' => false,
'posts_per_page' => -1
));
// Проверяем, выбран ли урок
if (!empty($my_dropdown)) {
// Получаем объект выбранного урока
$selected_lesson = get_post($my_dropdown);
// Проверяем, существует ли выбранный урок
if ($selected_lesson) {
// Выводим заголовок урока как ссылку
echo '<p>Выбранный урок: <a href="' . get_permalink($selected_lesson) . '">' . esc_html($selected_lesson->post_title) . '</a></p>';
}
}
// Отображение выпадающего списка
echo '<p>Выберите урок: <select name="_dappcf_i_dropdown" class="widefat" style="width:170px">';
foreach ($posts as $post) {
echo '<option value="' . $post->ID . '"';
if ($my_dropdown == $post->ID) {
echo ' selected="selected"';
}
echo '>' . esc_html($post->post_title) . '</option>';
}
echo '</select></p>';
Заключение
Внесённые изменения позволяет пользователю видеть заголовок выбранного урока в виде ссылки, что улучшает взаимодействие с интерфейсом. Работая с WordPress, оптимизация и удобство пользовательского интерфейса являются важными факторами, влияющими на общее восприятие вашего сайта. С помощью описанного выше кода можно создать интуитивно понятный и функциональный элемент выбора.