Añadir campo de entrada a 'Páginas > Editar página' mediante functions.php
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) . '"]'); ?>

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) . '"]'); ?>

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)

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.

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.

@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.

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().
