it-swarm.com.de

Fügen Sie dem benutzerdefinierten Beitragstyp ein spezielles Meta-Feld hinzu

Ich habe es geschafft, meinem benutzerdefinierten Beitragstyp eine Meta-Box hinzuzufügen (siehe Code unten). Jetzt muss ich eine weitere Meta-Box hinzufügen. Mit diesem Feld möchte ich einen Wert aus einer anderen Tabelle mit dem Namen wp_project_bids_mitglied anzeigen/bearbeiten. Diese Tabelle enthält eine Zeile mit den Beitrags-IDs und eine Zeile mit den Werten (0,1,2), die ich in meinem Backend bearbeiten/anzeigen möchte. Wie muss ich den Code ändern, um dieses Ziel zu erreichen? Vielen Dank!

function add_custom_meta_box() {
add_meta_box(
    'custom_meta_box', // $id
    'Dauer', // $title
    'show_custom_meta_box', // $callback
    'project', // $page
    'normal', // $context
    'high'); // $priority
}
add_action('add_meta_boxes', 'add_custom_meta_box');

// Field Array
$prefix = 'custom_';
$custom_meta_fields = array(


array(
    'label'=> 'Select Box',
    'desc'  => 'Fotoauftrag Dauer angeben',
    'id'    => $prefix.'dauer',
    'type'  => 'select',
    'options' => array (
        'one' => array (
            'label' => '1-3',
            'value' => 'a'
        ),
        'two' => array (
            'label' => '3-6',
            'value' => 'b'
        ),
        'three' => array (
            'label' => '6-9',
            'value' => 'c'
        ),
        'four' => array (
            'label' => '>9',
            'value' => 'd'
                  )
    )
)
);

// The Callback
function show_custom_meta_box() {
global $custom_meta_fields, $post;
// Use nonce for verification
echo '<input type="hidden" name="custom_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />';

// Begin the field table and loop
echo '<table class="form-table">';
foreach ($custom_meta_fields as $field) {
    // get value of this field if it exists for this post
    $meta = get_post_meta($post->ID, $field['id'], true);
    // begin a table row with
    echo '<tr>
            <th><label for="'.$field['id'].'">'.$field['label'].'</label></th>
            <td>';
            switch($field['type']) {
                // case items will go here
                // text



case 'select':
echo '<select name="'.$field['id'].'" id="'.$field['id'].'">';
foreach ($field['options'] as $option) {
    echo '<option', $meta == $option['value'] ? ' selected="selected"' : '', ' value="'.$option['value'].'">'.$option['label'].'</option>';
}
echo '</select><br /><span class="description">'.$field['desc'].'</span>';
break;
            } //end switch
    echo '</td></tr>';
} // end foreach
echo '</table>'; // end table
}

// Save the Data
function save_custom_meta($post_id) {
global $custom_meta_fields;

// verify nonce
if (!wp_verify_nonce($_POST['custom_meta_box_nonce'], basename(__FILE__)))
    return $post_id;
// check autosave
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
    return $post_id;
// check permissions
if ('page' == $_POST['post_type']) {
    if (!current_user_can('edit_page', $post_id))
        return $post_id;
    } elseif (!current_user_can('edit_post', $post_id)) {
        return $post_id;
}

// loop through fields and save the data
foreach ($custom_meta_fields as $field) {
    $old = get_post_meta($post_id, $field['id'], true);
    $new = $_POST[$field['id']];
    if ($new && $new != $old) {
        update_post_meta($post_id, $field['id'], $new);
    } elseif ('' == $new && $old) {
        delete_post_meta($post_id, $field['id'], $old);
    }
} // end foreach
}
1
cgscolonia

Der gesamte Code besteht darin, den Prozess zu replizieren und nicht den eigentlichen Code anzugeben. Sie müssen herausfinden, wie Ihr Prozess diesem Szenario gerecht werden kann. Ich habe jede mögliche Zeile kommentiert. Bitte lesen Sie die Inline-Kommentare, um das richtige Verständnis zu erhalten.

Schritt 1

Zunächst erstellt der erste Teil Ihres Codes eine benutzerdefinierte Meta-Box. Verwenden Sie also den Teil, um zuerst Ihre Meta-Box zu erstellen:

<?php
//making the meta box (Note: meta box != custom meta field)
function wpse_add_custom_meta_box_2() {
   add_meta_box(
       'custom_meta_box-2',       // $id
       'Dauer2',                  // $title
       'show_custom_meta_box_2',  // $callback
       'project',                 // $page
       'normal',                  // $context
       'high'                     // $priority
   );
}
add_action('add_meta_boxes', 'wpse_add_custom_meta_box_2');
?>

Schritt 2

Ihre Meta-Box ist jetzt fertig. Jetzt müssen Sie einige Formularfelder erstellen, um Benutzerdaten abzurufen. Dazu verwenden wir die Funktion $callback, die wir gerade deklariert haben:

<?php
//showing custom form fields
function show_custom_meta_box_2() {
    global $post;

    // Use nonce for verification to secure data sending
    wp_nonce_field( basename( __FILE__ ), 'wpse_our_nonce' );

    ?>

    <!-- my custom value input -->
    <input type="number" name="wpse_value" value="">

    <?php
}
?>

Schritt 3

Auf dem Beitrag speichern die beiden Felder post Werte, jetzt müssen wir sie dort speichern, wo wir sie speichern wollen.

<?php
//now we are saving the data
function wpse_save_meta_fields( $post_id ) {

  // verify nonce
  if (!isset($_POST['wpse_our_nonce']) || !wp_verify_nonce($_POST['wpse_our_nonce'], basename(__FILE__)))
      return 'nonce not verified';

  // check autosave
  if ( wp_is_post_autosave( $post_id ) )
      return 'autosave';

  //check post revision
  if ( wp_is_post_revision( $post_id ) )
      return 'revision';

  // check permissions
  if ( 'project' == $_POST['post_type'] ) {
      if ( ! current_user_can( 'edit_page', $post_id ) )
          return 'cannot edit page';
      } elseif ( ! current_user_can( 'edit_post', $post_id ) ) {
          return 'cannot edit post';
  }

  //so our basic checking is done, now we can grab what we've passed from our newly created form
  $wpse_value = $_POST['wpse_value'];

  //simply we have to save the data now
  global $wpdb;

  $table = $wpdb->base_prefix . 'project_bids_mitglied';

  $wpdb->insert(
            $table,
            array(
                'col_post_id' => $post_id, //as we are having it by default with this function
                'col_value'   => intval( $wpse_value ) //assuming we are passing numerical value
              ),
            array(
                '%d', //%s - string, %d - integer, %f - float
                '%d', //%s - string, %d - integer, %f - float
              )
          );

}
add_action( 'save_post', 'wpse_save_meta_fields' );
add_action( 'new_to_publish', 'wpse_save_meta_fields' );
?>

Wie Sie es mit benutzerdefinierten Tabellen zu tun haben, bleiben wir bei $ wpdb class, um die erforderlichen Daten sicher zu speichern.

Bitte beachte, das ist nicht der Code, den du benötigst, das ist die Idee und der Prozess, wie du jetzt deinen Weg gestalten kannst. Denken Sie nur an zwei Dinge:

  1. show_custom_meta_box_2() ist der Bereich, in dem sich Ihr HTML-Formular befindet. Behandeln Sie diesen Teil wie ein einfaches HTML-Formular
  2. wpse_save_meta_fields() verknüpft mit den erforderlichen Aktionen speichert die Daten des Formulars, wenn der Beitrag veröffentlicht/gespeichert/aktualisiert wird. Führen Sie hier eine ordnungsgemäße Desinfektion und Validierung durch.

Ich hoffe es hilft. Danke an @toscho für den letzten Chat . <3

8
Mayeenul Islam