¿Cómo puedo agregar/actualizar la publicación meta en una página de menú de administración?

Quería crear un complemento para administrar por lotes los datos de campo personalizados de las publicaciones. Sé que puedo agregar meta meta agregando un cuadro meta en la pantalla de edición posterior y uso add_action ('save_post', 'function_to_update_meta') para activar agregar funciones meta.

Pero no sé cómo activar la función add_post_meta en una página de menú de administración (como un menú de administración personalizado). ¿Como hacer eso?

Gracias de antemano!

preguntado el 28 de julio de 12 a las 03:07

2 Respuestas

El ejemplo dado en el códice de Wordpress es probablemente el mejor y más seguro en la forma de procesar la información:

Agregar metabox

Cópielo y péguelo y luego juegue con él para tener una buena idea de cómo controlar sus publicaciones y páginas.

Lo bueno es que no necesita preocuparse por verificar si necesita Agregar vs Actualizar un campo Post Meta determinado. Utilizando Actualizar publicación meta se asegurará de que se tomen las medidas adecuadas, incluso si el campo no existe.

Lo mismo ocurre con Opción de actualización si desea agregar algunos controles globales que su complemento/tema podría usar.

EJEMPLO DE DESGLOSE:

add_action( 'add_meta_boxes', 'myplugin_add_custom_box' );
add_action( 'save_post', 'myplugin_save_postdata' );

Estos son los ganchos de acción. El primero se ejecuta cuando se completan metacuadros dentro del editor de publicaciones, y el segundo se ejecuta cuando se agrega O se actualiza una publicación.

function myplugin_add_custom_box()
{
    add_meta_box( 
        'myplugin_sectionid',
        __( 'My Post Section Title', 'myplugin_textdomain' ),
        'myplugin_inner_custom_box',
        'post' 
    );
    add_meta_box(
        'myplugin_sectionid',
        __( 'My Post Section Title', 'myplugin_textdomain' ), 
        'myplugin_inner_custom_box',
        'page'
    );
}

Esta función es llamada por el gancho de acción 'add_meta_boxes'. Observe que el nombre de la función y el segundo argumento del gancho de acción son exactamente iguales. Esto registra sus metaboxes, qué tipos de publicaciones se supone que deben aparecer y qué devolución de llamada se utiliza para generar el formulario contenido en su interior.

function myplugin_inner_custom_box( $post )
{
    wp_nonce_field( plugin_basename( __FILE__ ), 'myplugin_noncename' );

    $value = get_post_meta($post->ID, 'myplugin_new_field') ? get_post_meta($post->ID, 'myplugin_new_field') : 'New Field';

    echo '<label for="myplugin_new_field">';
    _e("Description for this field", 'myplugin_textdomain' );
    echo '</label> ';
    echo '<input type="text" id="myplugin_new_field" name="myplugin_new_field" value="'.$value.'" size="25" />';
}

Esta es la función a la que llaman los metaboxes registrados para generar el formulario automáticamente. Observe cómo la función se llama 'myplugin_inner_custom_box' y el tercer argumento en el registro de su metabox también se llama 'myplugin_inner_custom_box'.

El wp_nonce_field() genera un campo oculto en su formulario para verificar que los datos que se envían al formulario realmente provienen de Wordpress, y también se puede usar para finalizar la función en caso de que otros complementos estén usando el gancho de acción 'save_post'.

Observe también que el objeto $post se pasa como argumento. Esto le permitirá usar ciertas propiedades del objeto de publicación. Me he tomado la libertad de verificar si get_post_meta() devuelve algo con la ID de publicación dada. Si es así, el campo se llena con ese valor. Si no, se rellena con 'Nuevo campo'.

function myplugin_save_postdata( $post_id )
{
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
        return;
    if ( !wp_verify_nonce( $_POST['myplugin_noncename'], plugin_basename( __FILE__ ) ) )
        return;
    if ( 'page' == $_POST['post_type'] ) 
    {
        if ( !current_user_can( 'edit_page', $post_id ) )
        return;
    }
    else
    {
        if ( !current_user_can( 'edit_post', $post_id ) )
        return;
    }

    $mydata = $_POST['myplugin_new_field'];
    update_post_meta($post_id, 'myplugin_new_field', $mydata);
}

Esta es la función a la que llama el gancho de acción 'save_post'. Observe cómo el segundo argumento del segundo gancho de acción y esta función se llaman 'myplugin_save_postdata'. Primero, hay una serie de verificaciones que nuestro complemento debe pasar antes de que realmente pueda guardar cualquier dato.

Primero, no queremos que nuestros cuadros meta se actualicen cada vez que la publicación dada se actualice automáticamente. Si la publicación se actualiza automáticamente, cancela el proceso.

En segundo lugar, queremos asegurarnos de que los datos de nonce estén disponibles y verificarlos. Si no hay datos nonce disponibles o no se verifican, cancele el proceso.

En tercer lugar, queremos asegurarnos de que el usuario dado tenga el permiso edit_page. La función primero verifica el tipo de publicación y luego verifica el permiso apropiado. Si el usuario no tiene ese permiso, cancela el proceso.

Por último, nuestro complemento finalmente se ha verificado y queremos guardar la información. Me tomé la libertad de agregar la línea final update_post_meta() para mostrarle cómo se une todo.

Observe cómo se pasó $post_id a la función como argumento. Esta es una de las piezas necesarias para la función update_post_meta(). La clave se denominó 'myplugin_new_field' y el valor de esos metadatos ahora se guarda como lo que ingrese en ese campo de entrada personalizado en su metabox personalizado.

Eso es tan fácil como puedo explicar todo el proceso. Solo estúdialo y ensúciate las manos con el código. La mejor manera de aprender es a través de la aplicación en lugar de la teoría.

Respondido 28 Jul 12, 17:07

Revisé esos ejemplos, pero no encontré lo que busco. Permítanme mejorar mi expresión: ¿puedo usar 'update_post_meta()' dentro de una página de menú agregada por 'add_menu_page()'? - daiwei

Absolutamente. update_post_meta() y update_option() se pueden ejecutar en cualquier lugar. - maiorano84

Soy principiante en PHP, por lo que esto puede ser muy obvio para usted, pero muy confuso para mí. update_post_meta() tiene que tomar una entrada (ID de publicación, clave meta relacionada y valor meta). debo usar y para recopilar datos primero (por supuesto en una página creada por add_menu_page())? Entonces, ¿cómo puedo activar update_post_meat() para usar los datos proporcionados pero el y escribir eso en una publicación relacionada? ¿Hay un gancho de acción como 'save_post'? - daiwei

Desglosaré su ejemplo lo mejor que pueda, pero está todo ahí, incluido el gancho de acción 'save_post'. Dame un poco. - maiorano84

@Daiwei He desglosado el ejemplo de Wordpress para usted y lo he agregado en unas pocas líneas para que sea un ejemplo de trabajo. Déjeme saber si esto ayuda. - maiorano84

La respuesta fue de la misma pregunta que hice en otro lado

Y creé mi versión de ejemplo.

Agregué alguna función de console.log para probar, pero básicamente está haciendo lo mismo que la respuesta de @Chris_():

Función de devolución de llamada de menú para generar contenido de menú (PHP):

function ajax_menu_callback() {
?>
<div class="wrap">
    <div id="icon-themes" class="icon32"></div>
    <h2>Test</h2>
    <br />
    <form>
        <input id="meta" type ="text" name="1" value="<?php echo esc_html( get_post_meta( 1, 'your_key', true) ); ?>" />
        <?php submit_button(); ?>
    </form>
</div>
<?php
}

Luego, el javascript para imprimir en el lado del administrador (javascript, no olvide incluir una biblioteca jquery):

jQuery(document).ready(function() {
    $("form").submit(function() {
        console.log('Submit Function');
        var postMeta = $('input[name="1"]').val();
        console.log(postMeta);
        var postID = 1;
        var button = $('input[type="submit"]');
        button.val('saving......');
        $.ajax({
            data: {action: "update_meta", post_id: postID, post_meta: postMeta, },
            type: 'POST',
            url: ajaxurl,
            success: function( response ) { console.log('Well Done and got this from sever: ' + response); }
        }); // end of ajax()
        return false;
    }); // end of document.ready
}); // end of form.submit

Luego, la función PHP maneja update_post_meta (PHP):

add_action( 'wp_ajax_update_meta', 'my_ajax_callback' );
function my_ajax_callback() {
    $post_id = $_POST['post_id'];
    $post_meta = $_POST['post_meta'];
    update_post_meta( $post_id, 'your_key', $post_meta );
    echo 'Meta Updated';
    die();
} // end of my_ajax_callback()

Respondido 13 Abr '17, 13:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.