Pregunta

(Mi primer WP pregunta preguntado alguna vez!Ser suave!)

Estoy construyendo un sitio que es en su mayoría de las páginas (es decir, estática), usar WP como CMS.En la parte inferior de varias de las páginas, no aparecerá 1, 2, o 3 "promo cajas", básicamente botón de imágenes que enlazan a otras partes del sitio.Aunque sólo hasta 3 promo cajas aparecerá en una página determinada, habrá de ~30 diferentes a elegir de.

Cuando mi cliente crea una nueva página, me gustaría que él sea capaz de elegir promo cuadros de algo así como una lista desplegable de todos los posibles promo cajas.

A mí me parece que esto debería funcionar como este:

  • Crear un tipo de mensaje personalizado llamado "promo-box".(Aunque podría ser simplemente una etiqueta para los puestos de plantilla.)
  • El uso de una herramienta como Campo Personalizado De La Plantilla para crear un menú desplegable en el editor de la página, donde los valores de la lista desplegable de opciones se generan de forma dinámica a partir de la lista de todos los promo-cuadro de puestos.(Esta es la parte que no sé cómo hacer.)
  • Acceso a la resultante de metadatos (post número es realmente todo lo que necesita, entonces puedo conseguir todo lo demás) en la plantilla de página.

Basado en las respuestas a otras preguntas aquí, yo he tomado inicial se ve en WPAlchemy MetaBox, Posts-2-Puestos, y SLT Campos Personalizados, pero confieso que la documentación de cada uno de ellos es ligeramente geekier que yo, así que no he profundizado demasiado profundamente.

Asesoramiento?Es una de las herramientas de la solución adecuada para mí, y sólo tengo que averiguar?Me estoy perdiendo algo aquí?

¿Fue útil?

Solución

A medida que el autor de WPAlchemy , yo soy un sesgo poco, pero esencialmente tener un buen modelo de trabajo se indica a seguir dependiendo de lo que sea la ruta que elija.

Sin embargo, si se utiliza WPAlchemy, que, básicamente, hacer algo como lo siguiente (paso # 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 puede contener estilos que puede estilo de su formulario con y custom/meta.php es esencialmente un archivo HTML con el contenido forma de la caja de meta, en este caso, su baja caída, para generar su desplegables que haría una consulta wp personalizada para obtener todos los tipos de envíos personalizados. WPAlchemy tiene algunas funciones especiales de ayuda para ayudar en la creación de sus elementos de formulario.

para ayudarle cuando se trabaja en la plantilla.

El objetivo principal de WPAlchemy era mantener el control en manos de los desarrolladores, a partir de peluquería (ver + tacto) a meta definición contenido de la caja.

Y a mí mismo y los demás siempre están dispuestos a ayudar a los que comentar y hacer preguntas.

Otros consejos

Jeje, eres un novato! Vamos a rasgar en pedazos ya ...!

j / k:) Ofrecemos cálida bienvenida a todos los novatos aquí, encantados de contar contigo

.

Así que esta es la tercera vez que he oído este requisito, el doble de los clientes y no otra vez a usted (y su cliente.) Eso me dice que es una necesidad bastante común.

WordPress personalizado Metabox que muestra tres (3) Menús desplegables

Me gustaba su análisis, así que decidí código de una clase para hacer frente a su segundo punto. Lo llamé LittlePromoBoxes porque puedo nunca llegan esta canción de la cabeza, gracias a ellos. Básicamente yo uso la clase para encapsular para evitar posibles conflictos de nombre de otro modo con las funciones que había necesidad de escribir.

Podemos poner esta clase en el archivo functions.php de su tema o en un archivo .PHP de un plugin que podría estar escribiendo (pero no se preocupe, se parece mucho más compleja de lo que es.)

El primer on_load() función es una función estática que llamo al final de la declaración de clase para inicializar los tres (3) ganchos que necesitaremos (FYI funciones estáticas son esencialmente functions relacionados con la clase, no la instancia)

  1. El gancho init para registrar el tipo de poste promo-box,

  2. El gancho add_meta_boxes_post que permitirá definir la METABOX, y

  3. El gancho wp_insert_post_data que permitirá capturar las cajas promocionales seleccionados y guardar en la base de datos.

Cada uno de esos ganchos referencia a otra función estática en la clase (éstas eran las funciones que estaba de encapsulación mediante la creación de la clase.)

voy a omitir la descripción de la función action_init() y mi función auxiliar make_labels() asumiendo que conoce cómo registrar un tipo de destino basado en que se trate.

La función action_add_meta_boxes_post() registra el METABOX usando la función add_meta_box() núcleo de WordPress y lo he comentado sus parámetros para explicar por qué pasé lo que pasé para cada uno. El the_little_promo_boxes_metabox() llamada de retorno es, por supuesto, otra función estática de la clase y es lo que realmente muestra el contenido en el METABOX. Se utiliza principalmente el WordPress función básica wp_dropdown_pages() para mostrar una lista de cajas promocionales (nota que se mostrará otros tipos de envíos, además de 'página', pero sólo si están marcados como 'hierarchical'=>true en su registro de tipo de mensaje. ¿Por qué sólo jerárquica? porque esa es la forma en que lo escribió, por eso:!)

Ya que estamos mostrando tres (3) menús desplegables que necesitamos para dar a cada uno un identificador único en el HTML ("promo_box_{$i}") pero el mismo nombre con corchetes ('promo_boxes[]') por lo que PHP recogerlas en una matriz dentro de la variable $_POST < em> (que accede a WordPress para nosotros; verá cómo en un minuto) . Y, por supuesto, tenemos que establecer el valor seleccionado ((empty($promo_boxes[$i]) ? 0 : $promo_boxes[$i])) si es uno de los valores previamente habían sido seleccionados.

También utilicé el WordPress núcleo función get_post_type_object() para mostrar cómo obtener las etiquetas de un tipo de correos, y también utilizando el get_post_meta() función básica de WordPress para recuperar una matriz de ID de la caja de promoción del uso de la clave de campo personalizado '_promo_boxes', que me 'll mostrar lo que tiene que salvar al lado (nota que utilizó un guión precedente en la '_promo_boxes' nombre que hace que WordPress para esconderse de la interfaz de usuario campo personalizado estándar cuando el usuario está editando el puesto.) .

La última función para describir antes de ver el código es filter_wp_insert_post_data() que recibe los datos puesto existente en el primer parámetro ($data) y el contenido de la matriz $_POST gracias a WordPress como el segundo parámetro ($postarr). Dentro de esta función llamamos a la función update_post_meta() núcleo de WordPress y el extracto de la matriz cajas promocionales ($postarr['promo_boxes']) para guardar en el valor del campo personalizado para el '_promo_boxes' clave para el cargo especificado por la matriz $_POST (es decir $postarr['ID']).

Dicho esto, aquí está el código de la clase 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();

Todavía hay dos funciones (2) estáticos aún no mencionan: get_promo_boxes() y get_promo_box(); éstas son funciones de ayuda para ayudar a recuperar los mensajes de post_type='promo-box' por sus números ordinales 1..3. Sin embargo, para que sean más de WordPress como aquí son dos funciones de contenedor para añadir al archivo functions.php de su tema (Observe que puede pasar a un puesto como parámetro pero no tienen a menos que esté utilizando otro puesto que el uno en El circular):

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);
}

Ahora se puede llamar a una o ambas de estas funciones en el archivo de tema single.php con el código que podría tener este aspecto (este código podría haber sido escrito en un bucle pero la mayoría de los diseñadores de temas de WordPress parecen como de código duplicado por lo que puede leerlo en lugar de eliminar la redundancia Así, cuando en Roma ...):.

<?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>';
?>
Licenciado bajo: CC-BY-SA con atribución
scroll top