it-swarm.com.de

Seiten mit Kontrollkästchen in einer Metabox auflisten (und speichern)

Folgendes versuche ich im Grunde zu erreichen:

  1. Ich habe einen benutzerdefinierten Beitragstyp namens "Anführungszeichen".
  2. Ich habe eine Reihe von WordPress-Seiten

Ich versuche Folgendes zu tun: Jedes Mal, wenn ich einen neuen "QUOTES" -Post erstelle, möchte ich in der Lage sein, auszuwählen, auf welche Seite dieser Zitat-Post gehen soll. Ich habe mich dazu entschlossen, eine neue Metabox auf der Post-Seite "Anführungszeichen" zu erstellen und in dieser Metabox alle Seiten mit einem Kontrollkästchen davor aufzulisten:

pages listing metabox screenshot

Alles in Ordnung und gut, aber jetzt weiß ich nicht, wie ich diese Kontrollkästchen speichern soll.

Hier ist die Funktion, mit der ich den Inhalt der Metabox drucke:

function myplugin_inner_custom_box( $post ) {
    $custom = get_post_custom($post->ID);
    $checkfield = $custom["checkfield"][0];

    // Nonce to verify intention later
    wp_nonce_field( 'save_quote_meta', 'custom_nonce' ); 
    $pages = get_pages(); 

    foreach ( $pages as $page ) { ?>   
        <input type="checkbox" name="checkfield_<?php echo $page->ID; ?>" value="yes" <?php if ($checkfield == 'yes') { ?> checked <?php } ?> /> <?php echo $page->post_title; ?> <br>   
    <?php 
    } 
}

Und hier ist die Funktion, mit der ich sie speichere:

//save the meta box action
add_action( 'save_post', 'myplugin_meta_save' );

//save the meta box
function myplugin_meta_save()
{
    global $post;
    update_post_meta($post->ID, 'checkfield', $_POST['checkfield'] );
}

Offensichtlich funktioniert das nicht - ich bin nicht sicher, wie ich all diese Kontrollfeldwerte speichern soll.

4
Gabriela

Sie verwenden checkfield_<?php echo $page->ID; ?> als Namen für Ihre Eingabefelder und versuchen dann, den $_POST['checkfield'] zu speichern, der not set ist.

Sie können dieselbe $pages-Schleife für die myplugin_meta_save()-Funktion ausführen und dann die Daten für jede Seite als separate meta_key-Eingabe (checkfield_1, checkfield_5 usw.) speichern. OR Sie können alle diese Daten in einem einzigen meta_key speichern checkfield in diesem Fall und eine kleine Änderung an Ihrem Code ist erforderlich, um dies zu erreichen:

function myplugin_inner_custom_box( $post ) {
    // we store data as an array, we need to unserialize it
    $checkfield = maybe_unserialize( get_post_meta($post->ID, "checkfield", true) );

    // Nonce to verify intention later
    wp_nonce_field( 'save_quote_meta', 'custom_nonce' ); 

    $pages = get_pages(); 
    foreach ( $pages as $page ) { ?>
        <input id="page_<?php echo $page->ID; ?>" type="checkbox" name="checkfield[]" value="<?php echo $page->ID; ?>" <?php if ( in_array($page->ID, (array) $checkfield) ) { ?> checked <?php } ?>/> <label for="page_<?php echo $page->ID; ?>"><?php echo $page->post_title; ?></label> <br>
<?php 
    } 
}
//save the meta box action
add_action( 'save_post', 'myplugin_meta_save', 10, 2 );

//save the meta box
function myplugin_meta_save($post_id, $post)
{   
    if ( isset($_POST['checkfield']) ) { // if we get new data

        update_post_meta($post_id, "checkfield", $_POST['checkfield'] );

    }
}

Beachten Sie, dass name="checkfield" im Eingabefeld durch name="checkfield[]" ersetzt wird, wodurch Daten als Array in der Variablen $_POST['checkfield'] gespeichert werden. Auch das Attribut value wird von yes in $page->ID geändert.

Update: checkfield in array umwandeln: if ( in_array($page->ID, (array) $checkfield) )

4
Ahmad M