web-dev-qa-db-fra.com

Enregistrer ou mettre à jour les données lorsque la publication personnalisée est publiée

J'ai metabox sur mon écran de message personnalisé.

enter image description here

Comment les sauvegarder lorsqu'elles sont cochées, puis utiliser ou afficher en écho les offres cochées à afficher sur single.php?

mon code pour metabox est

function op_register_menu_meta_box() {
    add_meta_box(
        'op-menu-meta-box-id', // Metabox ID
         esc_html__( 'Custom offers Checklist (select any 2)', 'text-domain' ), //Metabox Title
        'op_render_menu_meta_box', // Metabox Callback Function
        'listing' // Place Where this Metbax Should Appear
        );
}
add_action( 'add_meta_boxes_listing', 'op_register_menu_meta_box' ); //Metabox Hook

function op_render_menu_meta_box() { // Metabox Callback Function Called
    // Metabox content
    $getPostsToSelect = get_posts(
                        array(
                            'post_type' => 'offers',
                            'posts_per_page' => 3,
                        ));
    foreach ($getPostsToSelect as $aPostsToSelect) {
    wp_nonce_field( basename( __FILE__ ), 'prfx_nonce' ); //Adds a valid nonce for security (1. Filename should be unique, 2. Object name should be diffrent for forms)
    ?>
    <label>
        <input 
          type='checkbox' 
          name='offers_meta' 
          class='postsToSelect'
          value='<?php echo $aPostsToSelect->ID ?>'
         /> 
        <?php echo $aPostsToSelect->post_title;

?>
    </label><br/>
    <?php
}
}
1
Nimesh

Comment les sauvegarder lorsqu'elles sont vérifiées

Vous pouvez utiliser update_post_meta() , comme ceci:

add_action( 'save_post', 'op_save_offers_meta', 10, 2 );
function op_save_offers_meta( $post_id, $post ) {
    // Make sure that we can save the meta data.
    if ( ( empty( $post_id ) || empty( $post ) || ( 'listing' !== get_post_type( $post ) ) )
    || ( empty( $_POST['post_ID'] ) || $_POST['post_ID'] != $post_id || ! isset( $_POST['offers_meta'] ) )
    || ( empty( $_POST['offers_meta_nonce'] ) || ! wp_verify_nonce( $_POST['offers_meta_nonce'], 'save-offers-meta' ) )
    || ( ! current_user_can( 'edit_post', $post_id ) ) ) {
        return;
    }

    $offers_ids = wp_parse_id_list( $_POST['offers_meta'] );
    if ( ! empty( $offers_ids ) ) {
        update_post_meta( $post_id, '_offers_ids', $offers_ids );
    } else {
        delete_post_meta( $post_id, '_offers_ids' );
    }
}

J'ai également modifié votre op_render_menu_meta_box():

function op_render_menu_meta_box( $post ) { // Metabox Callback Function Called
    // Get the selected 'offers' (array of post IDs).
    $offers_ids = (array) get_post_meta( $post->ID, '_offers_ids', true );

    // Displays a nonce field, without referrer field.
    wp_nonce_field( 'save-offers-meta', 'offers_meta_nonce', false );

    // Metabox content
    $getPostsToSelect = get_posts(
                        array(
                            'post_type' => 'offers',
                            'posts_per_page' => 3,
                        ));
    foreach ($getPostsToSelect as $aPostsToSelect) {
    ?>
    <label>
        <input 
          type='checkbox' 
          name='offers_meta[]' 
          class='postsToSelect'
          value='<?php echo $aPostsToSelect->ID ?>'
          <?php checked( true, in_array( $aPostsToSelect->ID, $offers_ids ) ); ?>
         /> 
        <?php echo $aPostsToSelect->post_title;

?>
    </label><br/>
    <?php
}
}

, puis utilisez ou reprenez les offres vérifiées

Vous pouvez utiliser get_post_meta() pour récupérer les "offres" (c.-à-d. array d'ID de publication) - comme dans la procédure ci-dessus op_render_menu_meta_box()function, et effectuez une opération standard The Loop. pour afficher les détails de la publication. Exemple:

$post_id = get_the_ID();

// Get the selected 'offers' (array of post IDs).
$offers_ids = (array) get_post_meta( $post_id, '_offers_ids', true );

$q = new WP_Query( [
    'post_type' => 'offers',
    'post__in'  => $offers_ids,
] );

if ( $q->have_posts() ) {
    while ( $q->have_posts() ) {
        $q->the_post();
    ?>
        <h3><?php the_title(); ?></h3>
        <p><?php the_content(); ?></p>
    <?php
    }
}

wp_reset_query();
3
Sally CJ