it-swarm.com.de

So erstellen Sie einen Multicheck für Post-/Seiten-Meta-Boxen

Bitte helfen Sie mir zu verstehen, wie Multicheck-Typ für Metabox gemacht wird. Suche nach allem Internet und nichts. Vielen Dank.


AKTUALISIEREN

@ Jan Ich habe Kopfschmerzen von dieser Funktion. Ich weiß nicht, was falsch ist. Ich versuche Ihre Methode, aber nichts, dann versuche ich get_posts, aber mit dieser Methode habe ich zu viele Probleme. Bei deiner Methode bekomme ich diesen Fehler vor dem Inhalt:

Warning: urldecode() expects parameter 1 to be string, array given in Z:\home\mysite.net\www\wp-includes\query.php on line 1878

Hier ist mein Code:

<?php
        $catids = get_post_meta($post->ID,'_mtb_multicheck',false);
        $limit = 10;
        query_posts( array('posts_per_page' => $limit, 'cat' => $catids, 'paged' => get_query_var('paged') ) );
    ?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>

        <!-- Content-->

<?php endwhile; ?>  
            <?php pagination(); ?>
<?php else : ?>
            <!--Error message here-->

<?php endif; ?>

Ich möchte wissen, was meine Vatiables zurückbringen. Mach das:

query_posts( array('posts_per_page' => $limit, 'cat' => print_r($catids), 'paged' => get_query_var('paged') ) );

und bekomme dies auf meiner Seite:

Array ( [0] => 5 [1] => 5 [2] => 3 )

Ich denke, es werden meine query_posts gedruckt, nicht $ catids. Es ist ein großes Problem. Ich fühle mich wie ein Nerd. Bitte hilf mir.

2
Denis Belousov

In den Post-Metadaten können mehrere Werte entweder als separate Einträge in der Tabelle postmeta oder als ein Eintrag mit dem Wert als serialisiertes Array PHP gespeichert werden. Die Serialisierung erfordert möglicherweise weniger Code, aber die eindeutigen Einträge ermöglichen eine schnellere spätere Abfrage ("Gib mir alle Posts, bei denen mindestens Option A des Multichecks aktiviert ist").

Ich habe den Code genommen, mit dem Sie verlinkt haben und die folgenden Änderungen vorgenommen, um einen "Multicheck" zu ermöglichen:

// in show():
// Line 254: replace it by:
$meta = get_post_meta($post->ID, $field['id'], 'multicheck' != $field['type'] /* If multicheck this can be multiple values */);
// Add the following to the switch:
case 'multicheck':
    foreach ( $field['options'] as $value => $name ) {
        // Append `[]` to the name to get multiple values
        // Use in_array() to check whether the current option should be checked
        echo '<input type="checkbox" name="', $field['id'], '[]" id="', $field['id'], '" value="', $value, '"', in_array( $value, $meta ) ? ' checked="checked"' : '', ' /> ', $name, '<br/>';
    }
    break;

// In save():
// Line 358: replace it by:
$old = get_post_meta($post_id, $name, 'multicheck' != $field['type'] /* If multicheck this can be multiple values */);
// Lines 409-413: Wrap them in an else-clause, and prepend them by:
if ( 'multicheck' == $field['type'] ) {
    // Do the saving in two steps: first get everything we don't have yet
    // Then get everything we should not have anymore
    if ( empty( $new ) ) {
        $new = array();
    }
    $aNewToAdd = array_diff( $new, $old );
    $aOldToDelete = array_diff( $old, $new );
    foreach ( $aNewToAdd as $newToAdd ) {
        add_post_meta( $post_id, $name, $newToAdd, false );
    }
    foreach ( $aOldToDelete as $oldToDelete ) {
        delete_post_meta( $post_id, $name, $oldToDelete );
    }
} else {
    // The original lines 409-413
}

Zwei zusätzliche Änderungen, um PHP Warnungen zu verhindern, wenn WP_DEBUG aktiviert ist:

// Line 337:
if ( ! isset( $_POST['wp_meta_box_nonce'] ) || !wp_verify_nonce($_POST['wp_meta_box_nonce'], basename(__FILE__))) {
// Line 359:
$new = isset( $_POST[$field['id']] ) ? $_POST[$field['id']] : null;

Mit diesen Änderungen können Sie einen "Multicheck" wie folgt definieren:

array(
    'name' => 'Multicheck',
    'id' => $prefix . 'multicheck',
    'type' => 'multicheck',
    'options' => array(
        'a' => 'Apple',
        'b' => 'Banana',
        'c' => 'Cherry',
    ),
)
4
Jan Fabry