¿Cómo puedo agregar un atributo adicional en la sección 'Atributos de página' en wp-admin para páginas?

8 mar 2012, 23:17:36
Vistas: 26.2K
Votos: 14

Me gustaría agregar una lista desplegable en el cuadro Page Attribute que se ve en el lado derecho de la interfaz de administración para páginas.

¿Alguien sabe si esto es posible?

¿O al menos agregar un cuadro personalizado debajo de este cuadro?

0
Todas las respuestas a la pregunta 2
3
18

No hay ganchos convenientes para agregar algo a ese cuadro.

Podrías hacer una de dos cosas.

1. Agregar un nuevo Meta Box

Puedes hacer esto enganchándote a la acción add_meta_boxes y llamando a add_meta_box. Puedes especificar una función de callback en tu llamada a add_meta_box. Esa función callback se encargará de mostrar tu lista de selección.

<?php
add_action( 'add_meta_boxes', 'wpse44966_add_meta_box' );
/**
 * Agrega el meta box a la pantalla de página
 */
function wpse44966_add_meta_box()
{
    add_meta_box(
        'wpse44966-meta-box', // id, usado como atributo html id
        __( 'WPSE 44966 Meta Box' ), // título del meta box, como "Atributos de Página"
        'wpse44966_meta_box_cb', // función callback, muestra el contenido
        'page', // tipo de post o página. Lo agregaremos solo a páginas
        'side', // contexto (dónde en la pantalla)
        'low' // prioridad, ¿dónde debería ir esto en el contexto?
    );
}

/**
 * Función callback para nuestro meta box. Muestra el contenido
 */
function wpse44966_meta_box_cb( $post )
{
    // crea tu menú desplegable aquí
}

2. Eliminar el Meta Box de Atributos de Página por defecto y agregar tu propia versión

Todo el contenido en la pantalla de edición de entradas, excepto el editor principal y el área del título, es un meta box. Puedes eliminarlos llamando a remove_meta_box, luego reemplazarlos con los tuyos.

Entonces, primero modifica la función add anterior para incluir una llamada remove_meta_box. Luego necesitarás copiar el cuerpo de la función page_attributes_meta_box desde wp-admin/includes/meta-boxes.php y poner tus cosas debajo.

<?php
add_action( 'add_meta_boxes', 'wpse44966_add_meta_box' );
/**
 * Agrega el meta box a la pantalla de página
 */
function wpse44966_add_meta_box( $post_type )
{
    // elimina el predeterminado
    remove_meta_box(
        'pageparentdiv',
        'page',
        'side'
    );

    // agrega el nuestro
    add_meta_box(
        'wpse44966-meta-box',
        'page' == $post_type ? __('Atributos de Página') : __('Atributos'),
        'wpse44966_meta_box_cb', 
        'page', 
        'side', 
        'low'
    );
}

/**
 * Función callback para nuestro meta box. Muestra el contenido
 */
function wpse44966_meta_box_cb( $post )
{
    // Copia aquí el contenido de la función `page_attributes_meta_box`
    // agrega tu menú desplegable
}

De cualquier forma que lo hagas, necesitarás engancharte a save_post para guardar el valor de tu campo con add_post_meta y/o update_post_meta.

<?php
add_action( 'save_post', 'wpse44966_save_post' );
/**
 * Guarda el valor de nuestro campo personalizado
 */
function wpse44966_save_post( $post_id )
{
    // verifica nonces, permisos aquí
    // guarda los datos con update_post_meta
}

Este tutorial podría ayudarte.

8 mar 2012 23:43:40
Comentarios

Gracias por una gran respuesta. Esperaba algún tipo de hook, pero esto funcionará bien :)

Steven Steven
8 mar 2012 23:53:46

excelente solución y respuesta completa - el enlace de referencia completa los detalles - gracias

Q Studio Q Studio
5 dic 2012 15:08:26

A partir de WordPress 4.9 existe un action hook page_attributes_misc_attributes que se ejecuta justo después del campo Order y justo antes del texto de ayuda en la parte inferior de esta meta box, permitiendo expandir la meta box en lugar de necesitar reemplazarla. Pasa un único argumento, $post, el objeto del post actual.

Andy Macaulay-Brook Andy Macaulay-Brook
12 jul 2018 13:42:59
2

¡Woohoo! A partir de WP 4.9.0, existe un action hook para agregar código al metabox de Atributos de página: 'page_attributes_misc_attributes'. Consulta el Codex como referencia.

Ejemplo:

function wpse44966_page_attributes( $post ) {

    wp_nonce_field( 'wpse44966_page_attributes_nonce', 'wpse44966_page_attributes_nonce' );
    ?>
    <p class="post-attributes-label-wrapper wpse44966-label-wrapper">
        <label class="wpse44966-label" for="wpse44966_option" style="font-weight: 600;"><?php _e( 'Etiqueta de opción', 'textdomain' ); ?></label>
        <input id="wpse44966_option" name="wpse44966_option" type="checkbox" value="1" style="margin-left: 5px;"<?php if( isset( $post->wpse44966_option ) && $post->wpse44966_option ) echo ' checked="checked"'; ?>>
    </p>
    <?php
}
add_action( 'page_attributes_misc_attributes', 'wpse44966_page_attributes' );

function wpse44966_metabox_save_post( $post_id ) {
    if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
    if( ! isset( $_POST['wpse44966_page_attributes_nonce'] ) || ! wp_verify_nonce( $_POST['wpse44966_page_attributes_nonce'], 'wpse44966_page_attributes_nonce' ) ) return;
    if( ! current_user_can( 'edit_post', $post_id ) ) return;
    $wpse44966_option = (int) ( isset( $_POST['wpse44966_option'] ) && $_POST['wpse44966_option'] );
    update_post_meta( $post_id, 'wpse44966_option', $wpse44966_option );
}
add_action( 'save_post', 'wpse44966_metabox_save_post' );
10 oct 2020 23:10:09
Comentarios

Nota importante: Si estás usando el ID de la publicación de alguna manera en tu valor guardado, verifica que no sea una revisión primero. Yo estaba usando esto para guardar una opción del sitio basada en el ID de la publicación, pero a veces guardaba el ID de la revisión, causando problemas. Para hacer esto, agrega if( ! wp_is_post_revision( $post_id ) return;

Jeremy Carlson Jeremy Carlson
3 sept 2024 20:01:42