Пользовательское поле/Мета заполнены выпадающим списком существующих постов?

wordpress.stackexchange https://wordpress.stackexchange.com/questions/5750

  •  16-10-2019
  •  | 
  •  

Вопрос

(Мой первый вопрос WP когда -либо задавал! Будьте нежными!)

Я строю сайт, который в основном представляет собой страницы (т. Е. Статично), используя WP в качестве CMS. Внизу нескольких страниц появятся 1, 2 или 3 «промо-коробки»-в основном кнопки, которые связаны с другими частями сайта. Хотя на любой странице появятся только до 3 промо -ящиков, на выбор будет ~ 30 разных.

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

Мне кажется, это должно работать так:

  • Создайте пользовательский тип поста с названием «Промо-бокс». (Хотя это так же легко может быть тегом для обычных постов.)
  • Используйте такой инструмент, как Пользовательский шаблон поля Чтобы создать раскрывающийся список в редакторе страницы, где значения раскрывающихся параметров динамически генерируются из списка всех существующих сообщений промо-коробки. (Это та часть, которую я не знаю, как это сделать.)
  • Получите доступ к полученным метаданным (номер сообщения - это действительно все, что мне нужно, тогда я могу получить все остальное) в шаблоне страницы.

Основываясь на ответах на другие вопросы здесь, я начал первоначальный взгляд на Wpalchemy Metabox, Post-2-Posts и SLT пользовательские поля, но я признаюсь, что документация для каждой из них немного больше, чем я. слишком глубоко.

Совет? Является ли один из вышеперечисленных инструментов для меня правильным решением, и мне просто нужно понять это? Я что -то здесь упускаю?

Это было полезно?

Решение

Как автор из Wpalchemy, Я немного предвзято, но у вас, по сути, есть хорошая рабочая модель, на которой следует следовать, в зависимости от того, какой маршрут вы выберете.

Однако, если вы используете wpalchemy, вы в основном сделаете что -то вроде следующего (Шаг № 2):

//  functions.php

include_once 'WPAlchemy/MetaBox.php';

if (is_admin()) 
{
    // a custom style sheet if you want to do some fancy styling for your form
    wp_enqueue_style('custom_meta_css', TEMPLATEPATH . '/custom/meta.css');
}

// define the meta box
$custom_metabox = new WPAlchemy_MetaBox(array
(
    'id' => '_custom_meta',
    'title' => 'My Custom Meta',
    'template' => TEMPLATEPATH . '/custom/meta.php'
));

custom/meta.css может содержать стили, с которыми вы можете стилизовать свою форму, и custom/meta.php По сути, HTML -файл с содержимым формы мета -коробки, в данном случае, вы выпадаете, чтобы создать раскрывающееся вниз, вы выполните пользовательский запрос WP, чтобы получить все ваши пользовательские типы публикаций. Wpalchemy имеет несколько специальных вспомогательных функций, чтобы помочь создать элементы вашей формы.

Есть дополнительные документация помочь вам при работе в шаблоне.

Основной целью Wpalchemy было сохранить контроль в руках разработчика, от стиля (Some + Feel) до определения содержания мета -коробки.

И я и другие всегда готовы помочь тем, кто комментирует и задает вопросы.

Другие советы

Хе -хе, ты новичок! Мы собираемся разорвать тебя в клочья ...!

J/k :) Мы предлагаем теплый прием ко всем новичкам здесь, рады, что у вас есть.

Так что это третий раз, когда я слышал это требование, дважды от клиентов, а не снова от вас (и вашего клиента). Это говорит мне о том, что это достаточно распространенная потребность.

WordPress Custom Metabox showing Three (3) Dropdowns

Мне понравился ваш анализ, поэтому я решил кодировать класс, чтобы рассмотреть ваш 2 -й пункт. Я назвал это LittlePromoBoxes Потому что я никогда не смогу получить эта песня из моей головы, спасибо их. Анкет В основном я использую класс для инкапсуляции, чтобы избежать потенциальных конфликтов именования с функциями, которые мне нужно написать.

Вы можете поместить этот класс в свою тему functions.php файл или в файле .php плагина, который вы можете писать (Но не волнуйтесь, это выглядит намного сложнее, чем есть.)

Первая функция on_load() это статическая функция, которую я называю в конце объявления класса, чтобы инициализировать три (3) крючка, которые вам нужны (Статические функции, по сути, по сути функции, связанные с классом, не экземпляр) :

  1. А init крючок, чтобы зарегистрировать promo-box Тип сообщения,

  2. А add_meta_boxes_post крючок, чтобы позволить вам определить метабокс и

  3. А wp_insert_post_data Крюк, чтобы позволить вам запечатлеть выбранные промо -коробки и сохранить в базе данных.

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

Я пропущу описание action_init() функция и мой make_labels() Помощная функция, предполагая, что вы знаете, как зарегистрировать тип поста на основе вашего вопроса.

А action_add_meta_boxes_post() Функция регистрирует метабокс, используя основную функцию WordPress add_meta_box() И я прокомментировал, что это параметры, чтобы объяснить, почему я передал то, что я передал для каждого. Функция обратного вызова the_little_promo_boxes_metabox() Конечно, это еще одна статическая функция класса, и это то, что на самом деле отображает контент в метабокс. В первую очередь используется основная функция WordPress wp_dropdown_pages() Чтобы отобразить список промо -коробок (Обратите внимание, что он будет отображать другие типы публикаций, кроме «страницы», но только если они помечены как 'hierarchical'=>true в их регистрации типа поста. Почему только иерархический? Потому что именно так они написали, вот почему! :)

Поскольку мы показываем три (3) выпадающих списка, нам нужно дать каждому уникальному идентификатору в HTML ("promo_box_{$i}") но то же имя с квадратными скобками ('promo_boxes[]') так, что PHP собирает их в массив внутри $_POST переменная (Что WordPress обращается к нам; вы увидите, как через минуту). Анкет И, конечно, нам нужно установить выбранное значение ((empty($promo_boxes[$i]) ? 0 : $promo_boxes[$i])), если действительно одно из значений было выбран ранее.

Я также использовал основную функцию WordPress get_post_type_object() Чтобы показать, как получить этикетки из типа поста, а также использование основной функции WordPress get_post_meta() Чтобы получить массив идентификаторов промо -коробки от использования пользовательского ключа поля '_promo_boxes', который я покажу, что вы должны сохранить дальше (Примечание я использовал предыдущее подчеркивание в имени '_promo_boxes' Что заставляет WordPress скрываться от стандартного пользовательского пользовательского интерфейса, когда пользователь редактирует сообщение.).

Последняя функция, которую можно описать, прежде чем вы увидите, что код filter_wp_insert_post_data() которые получают существующие данные о публикации в первом параметре ($data) и содержимое $_POST массив благодаря WordPress в качестве второго параметра ($postarr) Внутри этой функции мы называем основную функцию WordPress update_post_meta() и извлечь массив промо -коробок ($postarr['promo_boxes']) Сохранить в пользовательском значении поля для ключа '_promo_boxes' для поста, указанного $_POST массив (т.е. $postarr['ID']).

Тем не менее, вот код для LittlePromoBoxes учебный класс:

class LittlePromoBoxes {
  static function on_load() {
    add_action('init',array(__CLASS__,'action_init'));
    add_action('add_meta_boxes_post',array(__CLASS__,'action_add_meta_boxes_post'));
    add_filter('wp_insert_post_data',array(__CLASS__,'filter_wp_insert_post_data'),10,2);
  }
  static function action_init() {
    register_post_type('promo-box',array(
      'labels'          => self::make_labels('Promo Box','Promo Boxes'),
      'public_queryable'=> false,
      'hierarchical'    => true,  // IMPORTANT!!! wp_dropdown_pages() requires 'hierarchical'=>true
      'show_ui'         => true,
      'query_var'       => false,
      'supports'        => array('title','editor','thumbnail','custom-fields'),
      'show_in_nav_menus'=>true,
      'exclude_from_search'=>true,
    ));
  }
  static function make_labels($singular,$plural=false,$args=array()) {
    if ($plural===false)
      $plural = $singular . 's';
    elseif ($plural===true)
      $plural = $singular;
    $defaults = array(
      'name'              =>_x($plural,'post type general name'),
      'singular_name'      =>_x($singular,'post type singular name'),
      'add_new'            =>_x('Add New',$singular),
      'add_new_item'      =>__("Add New $singular"),
      'edit_item'          =>__("Edit $singular"),
      'new_item'          =>__("New $singular"),
      'view_item'          =>__("View $singular"),
      'search_items'      =>__("Search $plural"),
      'not_found'          =>__("No $plural Found"),
      'not_found_in_trash'=>__("No $plural Found in Trash"),
      'parent_item_colon' =>'',
    );
    return wp_parse_args($args,$defaults);
  }
  static function action_add_meta_boxes_post($post) {
    add_meta_box(
      'little-promo-boxes',   // Metabox Name, used as the "id" for a wrapping div
      'Little Promo Boxes',   // Metabox Title, visible to the user
      array(__CLASS__,'the_little_promo_boxes_metabox'), // Callback function
      'post',                 // Add to the Edit screen for Post Types of 'post'  
      'side',                 // Show it in the sidebar (if center then it would be 'normal'
      'low'                   // Show it below metaboxes that specify 'high'
    );
  }
  static function the_little_promo_boxes_metabox($post) {
    $pto = get_post_type_object('promo-box');
    $default_options = array(
      'post_type' => 'promo-box',
      'show_option_none' => "Select a {$pto->labels->singular_name}",
    );
    $promo_boxes = get_post_meta($post->ID,'_promo_boxes',true);
    for($i=0; $i<=2; $i++) {
      wp_dropdown_pages(array_merge($default_options,array(
        'id'       => "promo_box_{$i}",
        'name'     => 'promo_boxes[]',
        'selected' => (empty($promo_boxes[$i]) ? 0 : $promo_boxes[$i]),
      )));
    }
  }
  static function filter_wp_insert_post_data($data, $postarr) {
    update_post_meta($postarr['ID'],'_promo_boxes',$postarr['promo_boxes']);
    return $data;
  }
  static function get_promo_boxes($post=false) {
    static $promo_boxes=array();
    if (!$post)
      $post = $GLOBALS['post'];
    if (!isset($promo_boxes[$post->ID])) {
      $promo_boxes[$post->ID] = get_post_meta($post->ID,'_promo_boxes',true);
      $index = 0;
      foreach($promo_boxes[$post->ID] as $promo_box_id) {
        $promo_boxes[$post->ID][$index++] = (is_numeric($promo_box_id) ? get_post($promo_box_id) : false);
      }
    }
    return $promo_boxes[$post->ID];
  }
  static function get_promo_box($number,$post=false) {
    $promo_boxes = self::get_promo_boxes($post);
    return $promo_boxes[$number-1];
  }
}
LittlePromoBoxes::on_load();

Есть еще две (2) статические функции, которые еще не упомянуты: get_promo_boxes() а также get_promo_box(); Это вспомогательные функции, которые помогут вам получить посты post_type='promo-box' по их порядковым номерам 1..3. Но чтобы сделать их больше WordPress, например, вот две функции обертки, чтобы добавить к вашей теме functions.php файл (Обратите внимание, что вы можете передать сообщение в качестве параметра, но вам не нужно, если вы не используете другой пост, который в том, что в Петля):

function get_little_promo_boxes($post=false) {
  return LittlePromoBoxes::get_promo_boxes($post);
}
function get_little_promo_box($number,$post=false) {
  return LittlePromoBoxes::get_promo_box($number,$post);
}

Теперь вы можете вызвать одну или обе эти функции в своих single.php Файл темы с кодом, который может выглядеть так (Этот код мог быть написан в цикле, но большинству намерений WordPress, похоже, любят дублировать код, чтобы они могли прочитать его вместо того, чтобы устранить избыточность. Итак, когда в Риме ...):

<?php
  $promo_boxes = get_little_promo_boxes();
  if (isset($promo_boxes[1]))
    echo '<div id="promo-box1" class="promo-box">' . get_the_title($promo_boxes[1]->ID) . '</div>';
  if (isset($promo_boxes[2]))
    echo '<div id="promo-box2" class="promo-box">' . get_the_title($promo_boxes[2]->ID) . '</div>';
  if (isset($promo_boxes[3]))
    echo '<div id="promo-box3" class="promo-box">' . get_the_title($promo_boxes[3]->ID) . '</div>';
?>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top