plantilla de página dentro de tipo de mensaje personalizado

He registrado un tipo personalizado y crea un archivo llamado archivo myCPT.php y otro para mensajes solos llamado myCPT.php sola. Lo que quiero hacer es crear una página donde te mostraré pocos puestos de mi tipo de correos personalizados. Dentro de mi archivo myCPT.php tengo un enlace llamado a decir 'Entradas especiales' y este enlace te la la página personalizada que será un poco diferente del archivo myCPT.php, la única diferencia es que aquí voy a usar una consulta personalizada para los puestos.

La única manera de hacer esto parece crear una plantilla de página, pero el problema es que no puedo asignar una plantilla de página a páginas dentro de mi CPT vi un plugin que me puede ayudar con la plantilla de página soporte para CPT, pero es bastante vieja y no sé si es compatible con la última versión del WP. ¿Esta es la única manera de hacer esto? ¿Esto es una buena práctica? ¿Otra cosa me recomiendas?.



Solución 1

Crees que sería tan simple como agregar
add_post_type_support( 'cptslug', 'page-attributes' );
en el código, pero no lo es. If you check the source Usted verá que la lista desplegable plantilla está restringido a la
page
poste tipo solamente. También hay a note in the Codex y una referencia a un closed Trac ticket sobre el tema.

Puede agregar esa caja a la CPT copiando la función del núcleo, haciendo una pequeña edición y agregando una nueva caja.
function my_cpt_attributes_meta_box($post) {
    $post_type_object = get_post_type_object($post->post_type);
    if ( $post_type_object->hierarchical ) {
        $dropdown_args = array(
            'post_type'        => $post->post_type,
            'exclude_tree'     => $post->ID,
            'selected'         => $post->post_parent,
            'name'             => 'parent_id',
            'show_option_none' => __('(no parent)'),
            'sort_column'      => 'menu_order, post_title',
            'echo'             => 0,
        );

        $dropdown_args = apply_filters( 'page_attributes_dropdown_pages_args', $dropdown_args, $post );
        $pages = wp_dropdown_pages( $dropdown_args );
        if ( ! empty($pages) ) {
?>
<p><strong><?php _e('Parent') ?></strong></p>
<label class="screen-reader-text" for="parent_id"><?php _e('Parent') ?></label>
<?php echo $pages; ?>
<?php
        } // end empty pages check
    } // end hierarchical check.

        $template = get_post_meta($post->ID,'_wp_page_template',true);

        ?>
<p><strong><?php _e('Template') ?></strong></p>
<label class="screen-reader-text" for="page_template"><?php _e('Page Template') ?></label><select name="page_template" id="page_template">
<option value='default'><?php _e('Default Template'); ?></option>
<?php page_template_dropdown($template); ?>
</select>

<p><strong><?php _e('Order') ?></strong></p>
<p><label class="screen-reader-text" for="menu_order"><?php _e('Order') ?></label><input name="menu_order" type="text" size="4" id="menu_order" value="<?php echo esc_attr($post->menu_order) ?>" /></p>
<p><?php if ( 'page' == $post->post_type ) _e( 'Need help? Use the Help tab in the upper right of your screen.' ); ?></p>
<?php
}
function add_my_cpt_attributes_meta_box() {
  add_meta_box(
    'my_cpt_attributes_meta_box',
    'My Box Name',
    'my_cpt_attributes_meta_box',
    'book',
    'side',
    'core'
  );
}
add_action( 'add_meta_boxes', 'add_my_cpt_attributes_meta_box' );
Si usted prueba ese código, te darás cuenta que aparece el cuadro pero no guarda los datos.

Here is why.

Vamos a tener que guardar los datos nosotros mismos.
function my_save_cpt_template($post_ID,$post) {
  $page_template = (isset($_POST['page_template'])) ? $_POST['page_template'] : false;
  $page_templates = wp_get_theme()->get_page_templates();
//   var_dump($page_template,$page_templates,'default' != $page_template && ! isset( $page_templates[ $page_template ] )); die;
  if ( 'default' != $page_template && ! isset( $page_templates[ $page_template ] ) ) {
      if ( $wp_error )
          return new WP_Error('invalid_page_template', __('The page template is invalid.'));
      else
          return 0;
  }
  update_post_meta($post_ID, '_wp_page_template',  $page_template);
}
add_action('save_post_cptslug','my_save_cpt_template',1,2);
Ahora se debe ahorrar, pero no se carga la plantilla.

Here is why.
get_single_template
se ejecuta antes de
get_page_template
, y
get_page_template
es lo que busca las plantillas especializadas. Así que tenemos que cargar esa plantilla de nosotros mismos.

add_action(
  'template_include',
  function ($template) {
    global $post;
    if (is_singular() && isset($post->post_type) && 'book' === $post->post_type) {
      $new = get_post_meta($post->ID,'_wp_page_template',true);
      $new = locate_template($new);
      if (!empty($new)) {
        $template = $new;
      }
    }
    return $template;
  }
);
Apenas probó. Posiblemente buggy.

Caveat emptor. No se aceptan devoluciones..

Solución 2

Si usted está agregando una consulta personalizada dentro de la plantilla para cargar los mensajes, el tipo de poste de esa página no tiene que ser el tipo de mensaje personalizado. Puede crear un sencillo de vainilla
page
, crear una plantilla para vía
page-your_page_slug.php
, o mediante una plantilla personalizada asignada en la lista desplegable de plantillas, entonces consulta para cualquier tipo de mensaje que quieres vía
WP_Query
.

Editar aquí es un ejemplo usando el
single_template
filtro. Tendrás que cambiar el tipo de entrada e indicaciones para coincidir con la tuya.

function wpa_single_cpt_template( $templates = '' ){
    $single = get_queried_object();

    if( 'myCPT' == $single->post_type
        && 'my-special-slug' == $single->post_name )
        $templates = locate_template( 'my-special-template.php', false );

    return $templates;
}
add_filter( 'single_template', 'wpa_single_cpt_template' );
adaptado del ejemplo en Template Hierarchy: Filter Hierarchy.

Template Hierarchy: Filter Hierarchy.

.




Problemas relacionados

Single.php por término de taxonomía personalizada Post tipo

Plantilla de mensaje personalizado tipo Root

Crear una página que se utilizará para crear un tipo de mensaje personalizado

Correos personalizados tipo Plugin: ¿Dónde pongo la plantilla?

ID al azar para el tipo de mensaje personalizado

¿Cambiar plantilla del Post de tipo de medida o Permalink cambiar dinámicamente?

¿Cómo obtener id post actual de un tipo de mensaje personalizado en un bucle usando plantilla singel type.php personalizado?

Página de correos personalizados tipo

Conde posts dentro de un tipo de mensaje personalizado y categoría específica

¿Cómo relacionar un tipo de mensaje personalizado a otro tipo de correos personalizados

Resalte los padres página elemento de menú en correos personalizados tipo

Tener una segunda página admin para un tipo de mensaje personalizado

Source: Stack Exchange Inc; License: cc by-sa 3.0 Contacto / Contact