Добавить URL к выбранному посту в метабоксе

Вопрос или проблема

Как я могу изменить этот код

$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, оптимизация и удобство пользовательского интерфейса являются важными факторами, влияющими на общее восприятие вашего сайта. С помощью описанного выше кода можно создать интуитивно понятный и функциональный элемент выбора.

Оцените материал
Добавить комментарий

Капча загружается...