Añadir campo de entrada a 'Páginas > Editar página' mediante functions.php

1 jul 2013, 15:22:06
Vistas: 14.2K
Votos: 2

Pregunta original:

Estoy intentando añadir un campo de entrada a 'Páginas > Editar página'. El propósito de este campo será que el usuario pueda añadir el ID de un slider, para que ese slider sea específico de la página.

Ejemplo:

  • El usuario añade el ID del slider en el campo de entrada en la pantalla de Editar página.
  • La página recupera ese ID.

Gracias a todos los que han respondido, sois una comunidad maravillosa, he recibido una excelente ayuda de este sitio, ¡gracias!

RESULTADO FINAL

functions.php

// Añadir campo personalizado para ID de slider en 'Editar página'
add_action( 'add_meta_boxes', 'cd_meta_box_add' );
function cd_meta_box_add() {
    add_meta_box( 'my-meta-box-id', 'Slider', 'cd_meta_box_cb', 'page', 'normal', 'high' );
}
function cd_meta_box_cb( $post ) {
    $values = get_post_custom( $post->ID );
    $text = isset( $values['my_meta_box_text'] ) ? esc_attr( $values['my_meta_box_text'][0] ) : '';
    wp_nonce_field( 'my_meta_box_nonce', 'meta_box_nonce' );
    ?>
    <p>
        <label for="my_meta_box_text">Añadir ID del slider</label>
        <input type="text" name="my_meta_box_text" id="my_meta_box_text" value="<?php echo $text; ?>" />
    </p>
    <?php   
}
add_action( 'save_post', 'cd_meta_box_save' );
function cd_meta_box_save( $post_id ) {
    // Salir si estamos haciendo un guardado automático
    if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
    // si nuestro nonce no está ahí, o no podemos verificarlo, salir
    if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'my_meta_box_nonce' ) ) return;
    // si el usuario actual no puede editar este post, salir
    if( !current_user_can( 'edit_post', $post_id ) ) return;
    // ahora podemos guardar los datos
    $allowed = array( 
        'a' => array( // permitir solo etiquetas a
            'href' => array() // y esos anclajes solo pueden tener atributo href
        )
    );
    // Buena idea verificar que tus datos están establecidos
    if( isset( $_POST['my_meta_box_text'] ) )
        update_post_meta( $post_id, 'my_meta_box_text', wp_kses( $_POST['my_meta_box_text'], $allowed ) );
}

Page.php

<?php echo do_shortcode( '[cycloneslider id="' . get_post_meta(get_the_ID(), 'my_meta_box_text', true) . '"]'); ?>
5
Comentarios

¿Por qué no usas algún plugin para hacerlo (especialmente si no eres programador)? Advanced Custom Fields debería funcionar para lo que necesitas.

Krzysiek Dróżdż Krzysiek Dróżdż
1 jul 2013 15:23:53

Muchísimas gracias por responder (¡y tan rápido también!).

Realmente no quería usar un plugin, me encantaría que la funcionalidad estuviera en el Child Theme. El objetivo es que este Child Theme no requiera plugins especiales y pueda ser editado fácilmente.

Estoy completamente dispuesto a hacerlo de la manera difícil, la recompensa, para mí, vale la pena :)

Paxjah Paxjah
1 jul 2013 15:34:57

@user771764 Si quieres guardar el ID del slider específico para todas las páginas, deberías usar meta boxes de posts http://codex.wordpress.org/Function_Reference/add_meta_box en lugar de opciones de wp.

Vinod Dalvi Vinod Dalvi
1 jul 2013 15:41:34

@Vinod Davli - ¡Muchísimas gracias por el consejo! Lo estoy implementando ahora, una pregunta rápida - ¿cómo puedo llamar al valor? Para wp option usé 'get_option' pero ¿qué debería usar para el meta? Gracias de nuevo :)

Paxjah Paxjah
1 jul 2013 15:48:01

Usa get_post_meta (http://codex.wordpress.org/Function_Reference/get_post_meta).

Krzysiek Dróżdż Krzysiek Dróżdż
1 jul 2013 15:54:37
Todas las respuestas a la pregunta 3
0

functions.php

// Añadir campo personalizado para ID de Slider en 'Editar Página'
add_action( 'add_meta_boxes', 'cd_meta_box_add' );
function cd_meta_box_add() {
    add_meta_box( 'my-meta-box-id', 'Slider', 'cd_meta_box_cb', 'page', 'normal', 'high' );
}
function cd_meta_box_cb( $post ) {
    $values = get_post_custom( $post->ID );
    $text = isset( $values['my_meta_box_text'] ) ? esc_attr( $values['my_meta_box_text'][0] ) : '';
    wp_nonce_field( 'my_meta_box_nonce', 'meta_box_nonce' );
    ?>
    <p>
        <label for="my_meta_box_text">Añadir un ID de slider</label>
        <input type="text" name="my_meta_box_text" id="my_meta_box_text" value="<?php echo $text; ?>" />
    </p>
    <?php   
}
add_action( 'save_post', 'cd_meta_box_save' );
function cd_meta_box_save( $post_id ) {
    // Salir si estamos haciendo autoguardado
    if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
    // Si nuestro nonce no está allí o no podemos verificarlo, salir
    if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'my_meta_box_nonce' ) ) return;
    // Si el usuario actual no puede editar este post, salir
    if( !current_user_can( 'edit_post', $post_id ) ) return;
    // Ahora podemos guardar los datos
    $allowed = array( 
        'a' => array( // permitir solo etiquetas a
            'href' => array() // y esos enlaces solo pueden tener atributo href
        )
    );
    // Buena idea asegurarse de que los datos están establecidos
    if( isset( $_POST['my_meta_box_text'] ) )
        update_post_meta( $post_id, 'my_meta_box_text', wp_kses( $_POST['my_meta_box_text'], $allowed ) );
}

Page.php

<?php echo do_shortcode( '[cycloneslider id="' . get_post_meta(get_the_ID(), 'my_meta_box_text', true) . '"]'); ?>
4 jul 2013 18:25:47
4

En primer lugar, deberías usar campos personalizados si deseas asignar algún valor adicional a una entrada/página y no de forma global para todo el sitio.

Luego, debes usar la función add_meta_box para registrar tu meta box personalizado, lo que permitirá editar estos campos personalizados fácilmente.

Aquí tienes un código de ejemplo:

// registrar tu meta box personalizado
function my_slider_properties_meta_box() {
    add_meta_box('my_slider_properties', 'Título del Formato de Enlace URL', 'my_slider_properties', 'page', 'side', 'default');
}
add_action('add_meta_boxes', 'my_slider_properties_meta_box');


// mostrar tu meta box personalizado
function my_slider_properties() {
    global $post; 

    $my_slider_id = get_post_meta($post->ID, '_my_slider_id', true);

    echo '<p>ID de mi slider</p>';
    echo '<input type="text" name="_my_slider_id" value="' . esc_attr($my_slider_id)  . '" size="40" />';
}


// procesar tu meta box personalizado al guardar
function my_slider_properties_save_meta($post_id, $post) {
    if ( !current_user_can( 'edit_post', $post->ID ))
        return $post->ID;

    $metas['_my_slider_id'] = $_POST['_my_slider_id'];

    foreach ($metas as $key => $value) {
        update_post_meta($post->ID, $key, $value);
    }
}
add_action('save_post', 'my_slider_properties', 1, 2);

Este es solo un ejemplo básico de cómo hacerlo. Deberías ocuparte de la seguridad (usar nonces) y otras cosas, supongo. Pero la idea debería quedar clara ahora.

(6 caracteres)

1 jul 2013 15:54:04
Comentarios

Usa add_meta_box('my_slider_properties', 'Título de URL en Formato de Enlace', 'my_slider_properties', 'page', 'side', 'default'); y no add_meta_box('my_slider_properties', 'Título de URL en Formato de Enlace', 'my_slider_properties', 'post', 'side', 'default'); porque el usuario quiere usar meta de post en páginas y no en entradas.

Vinod Dalvi Vinod Dalvi
1 jul 2013 16:18:35

Gracias, lo pasé por alto. Tienes razón, él quería agregarlo a páginas no a entradas :) Edité mi código, así que debería estar bien ahora.

Krzysiek Dróżdż Krzysiek Dróżdż
1 jul 2013 16:24:13

@Vinod Dalvi y Krzysiek Dróżdż - ¡Gracias a ambos! Ahora tengo el slider funcionando y se está llamando desde la plantilla, pero está llamando al primer slider que creé en cada página y tampoco mantiene el valor de cada slider dentro del campo de texto de entrada.

Paxjah Paxjah
1 jul 2013 16:33:47

He actualizado mi publicación original, realmente agradecería cualquier otra sugerencia que puedas darme :)

Paxjah Paxjah
1 jul 2013 18:31:25
1

Si deseas guardar el ID del slider específico para todas las páginas, entonces deberías usar meta cajas de publicación en lugar de las opciones de WordPress.

Para obtener el valor de las meta cajas de publicación, usa la función get_post_meta() en lugar de la función get_option().

1 jul 2013 16:15:14
Comentarios

He editado mi publicación original, ahora está respondida, gracias a todos :)

Paxjah Paxjah
1 jul 2013 18:46:02