web-dev-qa-db-fra.com

Comment créer un panneau et des champs personnalisés dans une page de publication [Plug-in]

Je voudrais écrire un plugin personnalisé qui ajoute un panneau personnalisé en dessous du panneau post-composition qui comportera quelques champs et un bouton d'envoi. JS s'engage à soumettre le contenu à la base de données, sans enregistrer ni interférer avec le mécanisme de post-sauvegarde/soumission.

Le but est de sauvegarder les données à utiliser et d’y accéder rapidement lors de la rédaction d’un message. Je pourrais faire une page de paramètres de plugin, mais je n'aime pas l'idée d'utiliser deux écrans quand on peut le faire au même endroit :)

J'ai vu les plugins Custom Field, mais ils ajoutent de la valeur à un message alors que je veux quelque chose de plus flexible, créé lors de la rédaction d'un message, mais pas nécessairement lié à ce message.

Je n'arrive pas à trouver comment faire ça ...

Merci!

1
Vallieres

Dans WordPress World, cela s'appelle "Meta box" et dans votre cas, ce serait la même chose que pour les posts, la seule chose que vous auriez besoin de faire différemment est la fonction de sauvegarde qui devrait sauvegarder les données dans la table d'options exemple du codex qui devrait fonctionner pour vous comme point de départ:

<?php
/* Define the custom box */
add_action( 'add_meta_boxes', 'myplugin_add_custom_box_WPA83147' );

/* Adds a box to the main column on the Post and Page edit screens */
function myplugin_add_custom_box_WPA83147() {
  add_meta_box( 
      'myplugin_sectionid',
      __( 'My Post Section Title', 'myplugin_textdomain' ),
      'myplugin_inner_custom_box_WPA83147',
      'post' 
  );
}

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

  // Use nonce for verification
  wp_nonce_field( plugin_basename( __FILE__ ), 'myplugin_noncename_WPA83147' );

  // The actual fields for data entry
  // Use get_option to retrieve an existing value from the database and use the value for the form
  $options = get_option('_WPA83147_options', array());
  echo '<label for="myplugin_new_field">';
       _e("Description for this field", 'myplugin_textdomain' );
  echo '</label> ';
  echo '<input type="text" id="myplugin_new_field" name="myplugin_new_field" value="'.(isset($options['myplugin_new_field']) ? $options['myplugin_new_field'] : "").'" size="25" />';
}


/* Do something with the data entered */
add_action( 'save_post', 'myplugin_save_postdata_WPA83147' );
/* When the post is saved, saves our custom data */
function myplugin_save_postdata_WPA83147( $post_id ) {
  // verify if this is an auto save routine. 
  // If it is our form has not been submitted, so we dont want to do anything
  if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
      return;

  // verify this came from the our screen and with proper authorization,
  // because save_post can be triggered at other times

  if ( !wp_verify_nonce( $_POST['myplugin_noncename_WPA83147'], plugin_basename( __FILE__ ) ) )
      return;


  // Check permissions
  if ( 'page' == $_POST['post_type'] ) 
  {
    if ( !current_user_can( 'edit_page', $post_id ) )
        return;
  }
  else
  {
    if ( !current_user_can( 'edit_post', $post_id ) )
        return;
  }

  // OK, we're authenticated: we need to find and save the data
  if (isset($_POST['myplugin_new_field'])){
    //sanitize user input
    $mydata = sanitize_text_field( $_POST['myplugin_new_field'] ); 
    //get all saved options
    $data = get_option('_WPA83147_options', array());
    //updated the field you need
    $data['myplugin_new_field'] = $mydata;
    //store in the database
    update_option('_WPA83147_options', $$data);
  }

}
1
Bainternet