web-dev-qa-db-fra.com

Comment puis-je ajouter une metabox pour extraire la liste des publications personnalisées (deux quelconques) lors de la modification ou de l'ajout d'écran?

Je souhaite ajouter metabox pour afficher la liste des publications personnalisées et en sélectionner deux à la modification ou à l'ajout d'écrans de publication. Et enfin, lorsque le message est publié, affichez-les sur une seule page. Aidez-moi, s'il vous plaît! Toute aide serait appréciée....

    add_action( 'add_meta_boxes', function () {
    add_meta_box(
        'yourcustom_sectionid', 
        __( '???? Custom Offer Section', 'yourtextdomain' ), 
        function ( $post ) {
            wp_nonce_field( plugin_basename( __FILE__ ), 'yourcustom_noncename' );
            $cstm = get_post_meta(get_the_ID(),'yourcustom_meta',true);
            echo "<pre>".print_r($cstm,true)."</pre>";
            $getPostsToSelect = get_posts('post_type=offers&numberposts=-1');
foreach ($getPostsToSelect as $aPostsToSelect) {
    ?>
    <label>
        <input 
          type='checkbox' 
          name='yourcustom_meta[]' 
          class='postsToSelect'
          value='<?php echo $aPostsToSelect->ID ?>'
         /> 
        <?php echo $aPostsToSelect->post_title ?>
    </label><br />
    <?php
}
        }, 
        'listing'
    );
} );

et ensuite en dessous:

echo "<script type='text/javascript'>
  var limit = 2;
jQuery('input.single-checkbox').on('change', function(evt) {
   if(jQuery('input.single-checkbox:checked').length > limit) {
       this.checked = false;
   }
});
</script>";

mais le jquery ne semble pas fonctionner pour sélectionner les deux cases cochées ... et après ce problème, aidez-moi à imprimer les deux messages sélectionnés.

le résultat que j'ai obtenu jusqu'à présent est avec 4 messages personnalisés nommés offre dans l'image ci-dessous enter image description here

1
Nimesh

Vous pouvez ajouter une metabox dans l'écran d'édition avec

add_action( 'add_meta_boxes', function () {
    add_meta_box(
        'yourcustom_sectionid', 
        __( '???? Custom Meta Box', 'yourtextdomain' ), 
        function ( $post ) {
            wp_nonce_field( plugin_basename( __FILE__ ), 'yourcustom_noncename' );
            $cstm = get_post_meta(get_the_ID(),'yourcustom_meta',true);
            echo "<pre>".print_r($cstm,true)."</pre>";
        }, 
        'page'
    );
} );

Vous pouvez interroger les publications avec get_posts() et ajouter des cases à cocher à l'intérieur de cette métabox.

$getPostsToSelect = get_posts('post_type=post&numberposts=-1');
foreach ($getPostsToSelect as $aPostsToSelect) {
    ?>
    <label>
        <input 
          type='checkbox' 
          name='yourcustom_meta[]' 
          class='postsToSelect'
          value='<?php echo $aPostsToSelect->ID ?>'
         /> 
        <?php echo $aPostsToSelect->post_title ?>
    </label><br />
    <?php
}

Vous auriez besoin de jQuery pour limiter à 2 sélectionnés. Ce serait quelque chose comme

var limit = 2;
jQuery('input.single-checkbox').on('change', function(evt) {
   if(jQuery('input.single-checkbox:checked').length > limit) {
       this.checked = false;
   }
});

Vous économiserez tout avec quelque chose comme:

add_action( 'save_post', function ( $post_id ) {

     if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
          return;
     if ( !wp_verify_nonce( $_POST['yourcustom_noncename'], plugin_basename( __FILE__ ) ) )
          return;
     if ( 'page' == $_POST['post_type'] ) { // not the Post Type
          if ( !current_user_can( 'edit_page', $post_id ) )
               return;
     } else {
          if ( !current_user_can( 'edit_post', $post_id ) )
               return;
     }

     update_post_meta($post_id,'yourcustom_meta',$_POST['yourcustom_meta']);
});

Ensuite, dans votre single.php, ou quel que soit l'endroit où vous voulez que les boucles s'affichent, il vous suffit de les appeler:

$cstm = get_post_meta(get_the_ID(),'yourcustom_meta',true);
foreach ($cstm as $aPostToDisplay) {
    echo "<pre>{$aPostToDisplay->ID} - {$aPostToDisplay->post_title}</pre>";
}

S'il vous plaît noter que j'ai libre remis cela (non testé), donc copier/coller ne fonctionnera pas .. C'est plus d'un guide logique.

J'ai supposé sans double vérification que name='yourcustom_meta[]' ne transmettrait que les vérifiés à $_POST['yourcustom_meta'], mais vous voudrez peut-être confirmer cela.

J'ai également utilisé des fonctions anonymes, qui ne devraient probablement pas être utilisées s'il s'agit d'un plugin/thème public.

3
David Sword