Search code examples
wordpressmetadata

How can I add/update post meta in a admin menu page?


I wanted to create a plugin to batch manage posts' custom field data. I know I can add post meta by adding a meta box in the post edit screen and using add_action('save_post', 'function_to_update_meta') to trigger add meta functions.

But I don't know how to trigger the add_post_meta function in an admin menu page (such as a custom admin menu). How to do that?

Thank you in advance!


Solution

  • The answer was from the same question I asked somewhere else

    And I created my version of example

    I added some console.log function for testing, but this is basically doning the same thing as @Chris_() answer:

    Menu callback function to generate menu content (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
    }
    

    Then the javascript to print on the admin side (javascript, don't forget to include a jquery library):

    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
    

    Then the PHP function handle 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()