it-swarm.com.de

so legen Sie den Standardwert für das Kontrollkästchen in WordPress fest

Ich habe ein Problem damit, den Standardwert für das Kontrollkästchen in WordPress festzulegen. Ich habe ein Kontrollkästchen Eingabefeld (Metabox) in einem benutzerdefinierten Beitrag. Ich möchte, dass das Kontrollkästchen standardmäßig aktiviert ist. und wenn der Benutzer es deaktiviert, sollte es gespeichert und deaktiviert werden und deaktiviert bleiben, wenn die Seite aktualisiert wird. Mein Problem ist, dass ich den Standardwert für das Kontrollkästchen nicht festlegen kann. Ich habe nur zwei Werte, mit denen ich arbeiten kann. Das Hauptproblem tritt auf, weil die Funktion savemetadata ausgeführt wird, wenn ich auf "Neuen Beitrag hinzufügen" klicke. Daher wird ein Standardwert automatisch in der Datenbank gespeichert, ohne den neuen Beitrag zu speichern. Ich habe es seit 3 ​​Tagen versucht. Ich habe versucht, einen Standardwert "Ja" zu speichern, wenn der Benutzer das Kontrollkästchen nicht aktiviert.

in diesem Fall wird das Kontrollkästchen beim Deaktivieren des Kontrollkästchens jedoch weiterhin mit dem Standardwert aktiviert. Mein aktuelles Code-Snippet

// for displaying metabox
function aps_add_meta_box() {
 add_meta_box(
    'aps_metabox',
    __( 'Slider Settings & Shortcode Generator', APS_TEXTDOMAIN ),
    'aps_metabox_cb', // callback
    'apspostslider', // screen or posttype
    'normal'
 );}
add_action( 'add_meta_boxes', 'aps_add_meta_box' );

function aps_metabox_cb( $post ) {
    wp_nonce_field( 'aps_meta_save', 'aps_meta_save_nounce' ); // nounce
    $aps_display_post_title = get_post_meta( $post->ID, 'aps_display_post_title', true );

    <input type="checkbox" name="aps_display_post_title" value="yes" <?php checked( $aps_display_post_title, 'yes'); />
}

Der Code zum Speichern von Metabox-Daten in der Speicherfunktion:

function aps_meta_save( $post_id ) {
    // Perform checking for before saving
    $is_autosave = wp_is_post_autosave($post_id);
    $is_revision = wp_is_post_revision($post_id);
    $is_valid_nonce = (isset($_POST['aps_meta_save_nounce']) && wp_verify_nonce( $_POST['aps_meta_save_nounce'], 'aps_meta_save' )? 'true': 'false');

    if ( $is_autosave || $is_revision || !$is_valid_nonce ) return;
   // Is the user allowed to edit the post or page?
    if ( !current_user_can( 'edit_post', $post_id )) return;
    $aps_display_post_title = (isset($_POST['aps_display_post_title']))? sanitize_text_field( $_POST["aps_display_post_title"] ): '' ;

    update_post_meta($post_id, "aps_display_post_title", $aps_display_post_title);
}
// save only when aps post slider posttype is saved
    add_action( 'save_post_apspostslider', 'aps_meta_save');

Ich habe beim Speichern den folgenden Code ausprobiert, aber in diesem Fall ist das Kontrollkästchen standardmäßig aktiviert. Aber wenn ich den Beitrag deaktiviere und speichere, bleibt das Kontrollkästchen aktiviert.

    $aps_display_post_title = (isset($_POST['aps_display_post_title']))? sanitize_text_field( $_POST["aps_display_post_title"] ): 'yes' ;

    update_post_meta($post_id, "aps_display_post_title", $aps_display_post_title);

UPDATE: Jetzt funktioniert alles, nachdem der Haken gewechselt wurde. Der Hook save_post wird ausgeführt, wenn ein Beitrag neu erstellt oder aktualisiert wird. Die Funktion zum Speichern der Metadaten würde ausgeführt, wenn ein Beitrag erstellt wird, und daher würde ein Standardwert in der Datenbank gespeichert. Nachdem Sie nun den Haken auf "edit_post" geändert haben, funktioniert nun alles. Vielen Dank an den Bruder Majick , der mir geholfen hat. Der gesamte Arbeitscode ist unten angegeben:

//Show meta box
function aps_add_meta_box() {
add_meta_box(
    'aps_metabox',
    __( 'Slider Settings & Shortcode Generator', APS_TEXTDOMAIN ),
    'aps_metabox_cb',
    'apspostslider',
    'normal'
);
}
add_action( 'add_meta_boxes', 'aps_add_meta_box' );

/**
 * Prints the box content.
 */
function aps_metabox_cb( $post ) {


    // Add a nonce field so we can check for it later.
    wp_nonce_field( 'aps_meta_save', 'aps_meta_save_nounce' );
    $aps_display_post_title = get_post_meta( $post->ID, 'aps_display_post_title', true );
    <input type="checkbox" name="aps_display_post_title" value="yes" <?php if ($aps_display_post_title != 'no') { echo 'checked'; }?>/>

}

// Save or Update metabox data
function aps_meta_save( $post_id, $post ) {

if ($post->post_type != 'apspostslider') {return;}
// Perform checking for before saving
$is_autosave = wp_is_post_autosave($post_id);
$is_revision = wp_is_post_revision($post_id);
$is_valid_nonce = (isset($_POST['aps_meta_save_nounce']) && wp_verify_nonce( $_POST['aps_meta_save_nounce'], 'aps_meta_save' )? 'true': 'false');

if ( $is_autosave || $is_revision || !$is_valid_nonce ) return;
// Is the user allowed to edit the post or page?
if ( !current_user_can( 'edit_post', $post_id )) return;

 if ( (isset($_POST['aps_display_post_title']))
         && ($_POST['aps_display_post_title'] == 'yes') ) {
        $aps_display_post_title = 'yes';
} else {$aps_display_post_title = 'no';}

    update_post_meta($post_id, "aps_display_post_title", $aps_display_post_title);

add_action( 'edit_post', 'aps_meta_save', 10, 2);
2
Kamal Ahmed

Ich denke, das Problem könnte die Logik bei der Verwendung von checked sein ...

 <input type="checkbox" name="aps_display_post_title" value="yes" <?php if ($aps_display_post_title != 'no') {echo 'checked';} ?> />

... andererseits kann das Ausführen von sanitize_text_field für den Kontrollkästchenwert ebenfalls das Problem verursachen.

Stattdessen möchten Sie die Logik möglicherweise anders aufschlüsseln, um das Verständnis zu erleichtern. Verwenden Sie dies zusammen mit dem obigen Code, der überprüft hat, dass der Wert nicht no ist, und daher standardmäßig aktiviert ist:

if ( (isset($_POST['aps_display_post_title'])) 
  && ($_POST['aps_display_post_title'] == 'yes') ) {
    $aps_display_post_title = 'yes';}
} else {$aps_display_post_title = 'no';}

update_post_meta($post_id, "aps_display_post_title", $aps_display_post_title);

UPDATE

Um zu verhindern, dass die Metasave-Funktion beim Erstellen eines Beitrags ausgelöst wird, geben Sie edit_post anstelle von save_post ein (und führen Sie die interne Überprüfung des Beitragstyps mithilfe des zweiten übergebenen Arguments durch, das $post lautet) ...

add_action( 'edit_post', 'aps_meta_save', 10, 2);

function aps_meta_save($post_id, $post) {

    if ($post->post_type != 'apspostslider') {return;}

    ...
2
majick

Ihr Code nimmt den Wert yes nur an, wenn der Benutzer das Formular ausfüllt. Sie können überprüfen, ob das Meta nicht vorhanden ist, und es dann überprüfen lassen oder Folgendes versuchen:

$aps_display_post_title = get_post_meta( $post->ID, 'aps_display_post_title', true );
$aps_display_post_title = ! ( 'off' == (string) $aps_display_post_title );

?>
    <input type="checkbox" name="aps_display_post_title" <?php checked( $aps_display_post_title ); ?> />
<?php


// updating the meta
$aps_display_post_title = ! empty($_POST['aps_display_post_title'])? 'on' : 'off'; // call this only when the checkbox is in the screen
update_post_meta( $post_id, "aps_display_post_title", $aps_display_post_title );

Ich denke, es sollte funktionieren. ABER rufen Sie das Aktualisierungsskript nicht auf, wenn sich das Kontrollkästchen nicht in dem Formular auf dem Bildschirm befindet, das die Kontrollkästchen deaktiviert, auch wenn es aktiviert ist.

0
Samuel Elh