Создание страниц также служит таксономией? Или посвятить таксономии целые страницы?


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

Но потом я понял, что мне тоже нужны эти игры, чтобы иметь полные страницы, загруженные информацией. Изначально я думал создать пользовательский тип публикации для страниц, и, используя пользовательские поля, я мог бы назвать обложку игры, показать дату ее выпуска, отобразить любые сообщения или обзоры об этой игре и отобразить их с краткими выдержками, а также использовать пользовательские таксономии для отображения издателя, разработчика игры и т. Д.

А потом я понял, что также хочу, чтобы у этих издателей и разработчиков тоже были свои собственные страницы. Описание, местоположение, ссылки на статьи с их участием, списки любых игр, приписываемых им... и так далее.

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

Я в затруднительном положении и не могу понять, как реорганизовать свой сайт. Я действительно хочу использовать все новые игрушки в WordPress, чтобы создать сайт, который я хочу, а не ограничивать WP тем, что я могу сделать. Есть какие-нибудь предложения? Я был мозговой штурм в течение нескольких дней, пытаясь что-то придумать. Любые предложения будут приняты с благодарностью.

Author: Chris, 2011-01-02

1 answers

Есть несколько вариантов, чтобы пойти с этим. На самом деле я прошел через тот же процесс, что и вы. Было бы легко, если бы Wordpress позволял вам связывать сообщения или пользовательские типы сообщений вместе, но вместо этого должны происходить хакерские атаки разработчиков Wordpress!

Решение, которое я использовал в плагине, над которым я работаю, немного банально, но оно работает для меня. В основном в моем плагине я хотел иметь тип записи под названием сериал, который содержит информацию о конкретном сериале, тип записи для эпизоды и другой тип сообщений для DVD- и Blu-ray-релизов. Я хотел, чтобы как типы публикаций эпизодов, так и выпусков ссылались на тип серии, из которой они взяты, поэтому, если я создам страницу публикации одной серии, на ней могут быть перечислены эпизоды и выпуски, а также информация о серии.

Мое решение включает пользовательское поле, содержащее идентификатор объекта серии. Первым способом добиться этого было создать метабокс, в котором было поле выбора всех сообщений серии типов:

public function get_select_array($post_type) {
    global $wpdb;
    $query = "SELECT ID, post_title FROM $wpdb->posts WHERE post_type = '$post_type' AND post_status = 'publish' ORDER BY post_title";
    $results = $wpdb->get_results($query, OBJECT);
    $series = array();
    foreach ($results as $result) {
        $series[] = array('name' => $result->post_title, 'value' => $result->ID);
    }
    return $series;                 
}

Функция get_select_array() в основном принимает пользовательский тип записи и возвращает заголовки и идентификаторы всех записей, опубликованных в массиве. Затем я использую этот массив для заполнения поля выбора. В моем плагине я использую класс создания metabox , созданный Rilwis, но я опубликую для вас некоторый код (код адаптирован из кода Rilwis):

add_meta_box('parent_series', 'Series', 'show_series_metabox', 'episode', 'side', 'high');  //add a side metabox
function show_series_metabox() {
    global $post;
    echo '<input type="hidden" name="wp_meta_box_nonce" value="', wp_create_nonce(basename(__FILE__)), '" />';  //nonce
    $series = get_select_array('series'); //get post titles and ID's of post type 'series
    $meta = get_post_meta($post->ID, 'parent_series', true); //get the meta value of the custom field
    echo '<select name="parent_series" id="parent_series">';//create the select box
    foreach ($series as $s) {
        echo '<option value="', $s['value'], '"', $meta == $s['value'] ? ' selected="selected"' : '', '>', $s['name'], '</option>';
    }
    echo '</select>';
}
add_action('save_post', 'save_series_metabox');
function save_series_metabox() {
    $real_post_id = isset($_POST['post_ID']) ? $_POST['post_ID'] : NULL ;   //get post id
    $old = get_post_meta($real_post_id, 'parent_series', true);             //get old stored meta value
    $new = $_POST['parent_series'];                                         //new meta value
    if ($new && $new != $old) {                                             //saving or deleting value
        update_post_meta($real_post_id, 'parent_series', $new);
    } elseif ('' == $new && $old) {
        delete_post_meta($real_post_id, 'parent_series', $old);
    }
}

Это добавит метабокс с выбором, в котором перечислены все доступные серии. Когда запись будет сохранена, идентификатор этой серии будет сохранено в пользовательском поле под названием "parent_series". Как только это будет сделано, вы можете позвонить по этому идентификатору и использовать его для вызова информации о серии с помощью пользовательского запроса. Или можно сделать наоборот: на странице сериала вы выполняете запрос для всех страниц эпизодов, которые имеют одинаковое значение в своем пользовательском поле/метаданных.

И вот оно у вас есть. Используя этот код, вы можете связать сообщения одного типа с сообщениями другого, в некотором смысле заставляя их работать как псевдотаксиономии. Я довольно быстро отредактировал код, так что если если вы обнаружите какие-либо ошибки или баги, дайте мне знать. Если есть лучшие способы сделать это, пожалуйста, дайте мне знать:)

 1
Author: Manny Fleurmond, 2020-06-15 08:21:38