it-swarm.com.de

Warum wird meine benutzerdefinierte Meta-Box-Eingabe nicht gespeichert?

Ich habe functions.php die folgende Funktion hinzugefügt, um eine benutzerdefinierte Meta-Box hinzuzufügen, mit der der Endbenutzer einen Galerie-Shortcode eingeben kann. Ich beabsichtige dann, dies zu verwenden, um eine Galerie an einer bestimmten Stelle auf der Seite zu platzieren (abseits der Hauptausgabe von the_content). Die Funktion, die ich benutze, stammt aus smashing magazine und, wie Sie vielleicht erraten haben, habe ich sehr wenig Ahnung, was ich tue, wenn es um PHP außerhalb der Standard-WordPress-Funktionen geht. (Ich habe vor, PHP in naher Zukunft vollständig zu lernen).

Meine Meta-Box wird gut angezeigt, aber die von mir eingegebenen Daten werden nicht gespeichert. Das heißt Wenn ich im Beitrag auf "Aktualisieren" klicke, kehrt die Meta-Box zu meinem Platzhaltertext zurück.

// Load the post meta box setup function on the post editor screen.
add_action ( 'load-post.php', 'rs_post_meta_boxes_setup' );
add_action ( 'load-post-new.php', 'rs_post_meta_boxes_setup' );

//Meta box setup function
function rs_post_meta_boxes_setup() {

    //Add meta boxes to the 'add_meta_boxes' wordpress hook.
    add_action ( 'add_meta_boxes', 'rs_add_post_meta_boxes' );

    // Save post meta once created on the 'save_post' hook.
    add_action( 'save_post', 'rs_save_job_gallery_meta', 10, 2 );
}

// Create meta boxes for display on the post editor screen
function rs_add_post_meta_boxes() {

    add_meta_box(
        'rs-job-gallery', //Meta box unique ID
        esc_html__( 'Job Gallery', 'rs-theme' ), //Title
        'rs_job_gallery_meta_box', //Callback Function
        'job', //Admin page on which to display meta box
        'normal',
        'default'
        );
}

// Display the post meta box
function rs_job_gallery_meta_box( $object, $box ) { ?>

    <?php wp_nonce_field( basename( __FILE__ ), 'rs_job_gallery_nonce' ); ?>

    <p>
        <label for="rs-job-gallery"> <?php _e( "Add the job gallery to the page. Use the following format: [galleryview id=x] where x is the ID of the job gallery.", 'redmansutherland' ); ?></label>
        <br/>
        <input class="widefat" type="text" placeholder="[galleryview id=X]" name="rs-job-gallery" id="rs-job-gallery" value="<?php echo esc_attr( get_post_meta( $object->ID, 'rs_job_gallery', true ) ); ?>" size="30"/>   
    </p>

    <?php }

// Save the meta box's post metadata.
function rs_save_job_gallery_meta( $post_id, $post ) {

    // Verify the nonce before proceeding.
    if ( !isset( $_POST['rs_job_gallery_nonce'] ) || !wp_verify_nonce( $_POST['rs_job_gallery_nonce'], basename( __FILE__ ) ) )
        return $post_id;

    // Get the post type object.
    $post_type = get_post_type_object( $post->post_type );

    // Check if the current user has permission to edit the post.
    if ( !current_user_can( $post_type->cap->edit_post, $post_id ) )
        return $post_id;

    // Get the posted data and sanitize it for use as an HTML class.
    $new_meta_value = ( isset( $_POST['rs_job_gallery'] ) ? sanitize_html_class( $_POST['rs_job_gallery'] ) : '' );

    // Get the meta key.
    $meta_key = 'rs_job_gallery';

    // Get the meta value of the custom field key.
    $meta_value = get_post_meta( $post_id, $meta_key, true );

    // If a new meta value was added and there was no previous value, add it.
    if ( $new_meta_value && '' == $meta_value )
        add_post_meta( $post_id, $meta_key, $new_meta_value, true );

    // If the new meta value does not match the old value, update it.
    elseif ( $new_meta_value && $new_meta_value != $meta_value )
        update_post_meta( $post_id, $meta_key, $new_meta_value );

    // If there is no new meta value but an old value exists, delete it.
    elseif ( '' == $new_meta_value && $meta_value )
        delete_post_meta( $post_id, $meta_key, $meta_value );

}

Vielen Dank im Voraus für alle Einblicke, die jemand gewähren kann. Ihre Hilfe wird sehr geschätzt!

2
Raskolnik

Versuchen Sie, Folgendes zu ändern:

<input class="widefat" type="text" placeholder="[galleryview id=X]" name="rs-job-gallery" id="rs-job-gallery" value="<?php echo esc_attr( get_post_meta( $object->ID, 'rs_job_gallery', true ) ); ?>" size="30"/>

dazu:

<input class="widefat" type="text" placeholder="[galleryview id=X]" name="rs_job_gallery" id="rs-job-gallery" value="<?php echo esc_attr( get_post_meta( $object->ID, 'rs_job_gallery', true ) ); ?>" size="30"/>

Grund: Wenn das Attribut "name" im Eingabefeld gesetzt ist, wird dies zur Variablen $_POST['input_name']. In Ihrem benutzerdefinierten Metanamen müssen Unterstriche verwendet werden, damit auch der Name Ihres Eingabefelds angezeigt wird.

Außerdem müssen Sie diesen Code ändern:

$new_meta_value = ( isset( $_POST['rs_job_gallery'] ) ? sanitize_html_class( $_POST['rs_job_gallery'] ) : '' );

zu so etwas:

$new_meta_value = ( isset( $_POST['rs_job_gallery'] ) ? esc_attr( $_POST['rs_job_gallery'] ) : '' );

Da sanitize_html_class es in Zahlen und Buchstaben zerlegt, kann es als Klasse in einem Element verwendet werden, aber das ist nicht das, was Sie wollen.

2
Jared