Pregunta

( Moderadores Nota: Título era originalmente "¿Cómo puedo añadir el " "selector para editor de entradas" Atributos de página" y / o" Atributos de página> plantilla)

WP actualmente sólo permite la asignación de una "plantilla" para Páginas (es decir post_type=='page'.) Me gustaría extender esta funcionalidad para Mensajes, así (es decir post_type=='post'.)

¿Cómo puedo añadir el "Atributos de página" caja de meta y, más concretamente, la plantilla de conmutación al editor de mensajes?

Estoy asumiendo que este es el código que va a colocar en mi functions.php de mi tema.

ACTUALIZACIÓN: Me las he arreglado para agregar las plantillas Hardcoded menú desplegable para mi editor de entradas, simplemente añadiendo el cuadro de selección html en mis opciones de metadatos personalizados existentes caja. Aquí está el código que estoy usando para eso ...

add_meta_box('categorydiv2', __('Post Options'), 'post_categories_meta_box_modified', 'post', 'side', 'high');

Y aquí está la función que escribe las opciones y seleccione la caja de la plantilla ...

//adds the custom categories box
function post_categories_meta_box_modified() {
    global $post;
    if( get_post_meta($post->ID, '_noindex', true) ) $noindexChecked = " checked='checked'";
    if( get_post_meta($post->ID, '_nofollow', true) ) $nofollowChecked = " checked='checked'";
?>
<div id="categories-all" class="ui-tabs-panel">
    <ul id="categorychecklist" class="list:category categorychecklist form-no-clear">
        <li id='noIndex' class="popular-category"><label class="selectit"><input value="noIndex" type="checkbox" name="chk_noIndex" id="chk_noIndex"<?php echo $noindexChecked ?> /> noindex</label></li> 
        <li id='noFollow' class="popular-category"><label class="selectit"><input value="noFollow" type="checkbox" name="chk_noFollow" id="chk_noFollow"<?php echo $nofollowChecked ?> /> nofollow</label></li>
    </ul>

    <p><strong>Template</strong></p> 
    <label class="screen-reader-text" for="page_template">Post Template</label><select name="page_template" id="page_template"> 
    <option value='default'>Default Template</option> 
    <option value='template-wide.php' >No Sidebar</option>
    <option value='template-salespage.php' >Salespage</option>
    </select>
</div>
<?php
}

Y, por último, el código para capturar los valores seleccionados en guardar ...

function save_post_categories_meta($post_id) {
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id;
    $noIndex = $_POST['chk_noIndex'];
    $noFollow = $_POST['chk_noFollow'];
    update_post_meta( $post_id, '_noindex', $noIndex );
    update_post_meta( $post_id, '_nofollow', $noFollow );
    return $post_id;
}

Ahora, creo que todo lo que queda es (1) la captura de la plantilla seleccionada y añadiendo al poste meta para este post y (2) la modificación de index.php y single.php para que utilice la plantilla elegida.

¿Fue útil?

Solución

odio ser el portador de malas noticias, pero WordPress hardcodes la funcionalidad plantilla de página a la "página" Tipo de publicación , al menos en la versión 3.0 ( Dicho cambio podría en futuras versiones, pero no hay una iniciativa específica soy consciente de que para cambiar todavía. Así que esta es una de las pocas veces que estoy luchando para encontrar la manera de moverse por la piratería algo sin núcleo.)

La solución que he llegado con es básicamente para copiar el código en cuestión de WordPress núcleo y modificarlo para nuestras necesidades. Estos son los pasos (los números de línea son de v3.0.1):

  1. Copia la función page_attributes_meta_box() de la línea 535 de /wp-admin/includes/meta-boxes.php y modificar para adaptarse.

  2. Código de un gancho add_meta_boxes para añadir el METABOX creado en el # 1.

  3. Copiar la función get_page_templates() de la línea 166 de /wp-admin/includes/theme.php y modificar para adaptarse.

  4. Copia la función page_template_dropdown() de la línea 2550 de /wp-admin/includes/template.php y modificar para adaptarse.

  5. Añadir una plantilla de entrada para su tema.

  6. Código de un gancho save_post para permitir el almacenamiento del nombre de archivo de plantilla de correo a la hora de guardar.

  7. Código un gancho single_template para habilitar la carga de la plantilla de entrada para los mensajes asociados.

Ahora manos a la obra!


1. Copiar la función page_attributes_meta_box()

A medida que nuestro primer paso que tiene que copiar la función page_attributes_meta_box() de la línea 535 de /wp-admin/includes/meta-boxes.php y he elegido para cambiar su nombre post_template_meta_box(). Dado que sólo pedirá plantillas de página omití el código para especificar un puesto de los padres y para especificar el orden que hace que el código mucho más simple. También elegí utilizar postmeta para este lugar de tratar de volver a utilizar la propiedad del objeto page_template con el fin de evitar y detectar posibles incompatibilidades provocadas por el acoplamiento no intencional. Así que aquí está el código:

function post_template_meta_box($post) {
  if ( 'post' == $post->post_type && 0 != count( get_post_templates() ) ) {
    $template = get_post_meta($post->ID,'_post_template',true);
    ?>
<label class="screen-reader-text" for="post_template"><?php _e('Post Template') ?></label><select name="post_template" id="post_template">
<option value='default'><?php _e('Default Template'); ?></option>
<?php post_template_dropdown($template); ?>
</select>
<?php
  } ?>
<?php
}

2. Código de un gancho add_meta_boxes

El siguiente paso es añadir la METABOX utilizando el gancho add_meta_boxes:

add_action('add_meta_boxes','add_post_template_metabox');
function add_post_template_metabox() {
    add_meta_box('postparentdiv', __('Post Template'), 'post_template_meta_box', 'post', 'side', 'core');
}

3. Copiar la función get_page_templates()

supuse que sólo tendría sentido para diferenciar entre las plantillas de página y plantilla de entrada así la necesidad de una función get_post_templates() basado en get_page_templates() de la línea 166 de /wp-admin/includes/theme.php. Pero en lugar de utilizar el marcador Template Name: plantillas de página, que utilizan esta función utiliza un marcador Post Template: vez que se puede ver a continuación.

También filtra a cabo la inspección de functions.php (no sé cómo get_page_templates() nunca ha funcionado correctamente sin eso, pero lo que sea!) Y lo único que queda es a las referencias de cambio a la palabra page a post para facilitar la lectura de mantenimiento por el camino:

function get_post_templates() {
  $themes = get_themes();
  $theme = get_current_theme();
  $templates = $themes[$theme]['Template Files'];
  $post_templates = array();

  if ( is_array( $templates ) ) {
    $base = array( trailingslashit(get_template_directory()), trailingslashit(get_stylesheet_directory()) );

    foreach ( $templates as $template ) {
      $basename = str_replace($base, '', $template);
      if ($basename != 'functions.php') {
        // don't allow template files in subdirectories
        if ( false !== strpos($basename, '/') )
          continue;

        $template_data = implode( '', file( $template ));

        $name = '';
        if ( preg_match( '|Post Template:(.*)$|mi', $template_data, $name ) )
          $name = _cleanup_header_comment($name[1]);

        if ( !empty( $name ) ) {
          $post_templates[trim( $name )] = $basename;
        }
      }
    }
  }

  return $post_templates;
}

4. Copiar la función page_template_dropdown()

Del mismo modo copiar page_template_dropdown() de la línea 2550 de /wp-admin/includes/template.php para crear post_template_dropdown() y simplemente cambiarlo a get_post_templates() llamada en lugar:

function post_template_dropdown( $default = '' ) {
  $templates = get_post_templates();
  ksort( $templates );
  foreach (array_keys( $templates ) as $template )
    : if ( $default == $templates[$template] )
      $selected = " selected='selected'";
    else
      $selected = '';
  echo "\n\t<option value='".$templates[$template]."' $selected>$template</option>";
  endforeach;
}

5. Añadir una plantilla de entrada

El siguiente paso es añadir una plantilla de entrada para la prueba. Con el marcador Post Template: mencionado en el paso # 3 copia single.php de su tema a single-test.php y añadir el siguiente comentario de cabecera ( asegúrese de modificar algo en single-test.php lo que puede indicar que se está cargando en lugar de single.php) :

/**
 * Post Template: My Test Template
 */

Una vez que haya terminado los pasos # 1 al # 5 se puede ver su "Post plantillas" METABOX aparecer en su página de entrada editor:

Lo que un post plantillas Metabox parecía que cuando se añade a WordPress 3.0
(fuente: mikeschinkel.com )

6. Código de un gancho save_post

Ahora que tiene el editor cuadrado de distancia que necesita para guardar la página en realidad el nombre de archivo de plantilla a postmeta cuando el usuario hace clic en "Publicar". Aquí está el código para que:

add_action('save_post','save_post_template',10,2);
function save_post_template($post_id,$post) {
  if ($post->post_type=='post' && !empty($_POST['post_template']))
    update_post_meta($post->ID,'_post_template',$_POST['post_template']);
}

7. Código de un gancho single_template

Y por último que necesita para conseguir realmente WordPress para utilizar sus nuevas plantillas de correos. Usted lo hace enganchando single_template y devolver el nombre de la plantilla deseada para los puestos que han tenido asignado:

add_filter('single_template','get_post_template_for_template_loader');
function get_post_template_for_template_loader($template) {
  global $wp_query;
  $post = $wp_query->get_queried_object();
  if ($post) {
    $post_template = get_post_meta($post->ID,'_post_template',true);
    if (!empty($post_template) && $post_template!='default')
      $template = get_stylesheet_directory() . "/{$post_template}";
  }
  return $template;
}

Y eso es todo!

Nota: que no lo hizo tener en cuenta Custom Pon Tipos , solamente post_type=='post'. En mi opinión frente a la costumbre tipos de envíos requerirían diferenciar entre los diferentes tipos de correos y, aunque no es excesivamente difícil, no intenté eso aquí.

Otros consejos

Wordpress le permite añadir a Meta Categorías usando un plugin:

Para hacer esto es necesario agregar una de las varias extensiones que se suma a la meta categorías (imitando lo que las páginas salen de la caja), simple plazo meta hace el trabajo muy bien.

N.B. Se necesita WordPress 3.x para extender Categorías.

Después de que se puede utilizar:

  • add_term_meta
  • update_term_meta
  • get_term_meta

Uso functions.php para agregar métodos para hacer lo que quiera por ejemplo.

add_action('category_add_form_fields', 'category_metabox_add', 10, 1);

function category_metabox_add($tag) { ?>
    <div class="form-field">
        <label for="image-url"><?php _e('Image URL') ?></label>
        <input name="image-url" id="image-url" type="text" value="" size="40" aria-required="true" />
        <p class="description"><?php _e('This image will be the thumbnail shown on the category page.'); ?></p>
    </div>
<?php } 

add_action('created_category', 'save_category_metadata', 10, 1);

function save_category_metadata($term_id)
{
    if (isset($_POST['image-url'])) 
        update_term_meta( $term_id, 'image-url', $_POST['image-url']);                  
}

Llamar a nuevos ámbitos en los temas es fácil:

<?php echo get_term_meta(get_query_var('cat'), 'image-url', true); ?>

Más detalles y ejemplos: http://www.wphub.com/adding-metadata-taxonomy-terms/

Licenciado bajo: CC-BY-SA con atribución
scroll top