Adăugare meta box special pentru tipuri de postări personalizate
Am reușit să adaug un meta box la tipul meu de postare personalizat (vezi codul de mai jos). Acum am nevoie să adaug încă un meta box. Cu această casetă vreau să afișez / editez o valoare dintr-un alt tabel numit wp_project_bids_mitglied. Acest tabel conține un rând cu ID-urile postărilor și un rând cu valorile (0,1,2) pe care aș dori să le editez / afișez în backend. Cum trebuie să modific codul pentru a atinge acest obiectiv? Mulțumesc!
function add_custom_meta_box() {
add_meta_box(
'custom_meta_box', // $id
'Durată', // $title
'show_custom_meta_box', // $callback
'project', // $page
'normal', // $context
'high'); // $priority
}
add_action('add_meta_boxes', 'add_custom_meta_box');
// Array-ul câmpurilor
$prefix = 'custom_';
$custom_meta_fields = array(
array(
'label'=> 'Casetă Selecție',
'desc' => 'Specificați durata comenzii foto',
'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'
)
)
)
);
// Funcția Callback
function show_custom_meta_box() {
global $custom_meta_fields, $post;
// Folosește nonce pentru verificare
echo '<input type="hidden" name="custom_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />';
// Începe tabelul câmpurilor și buclează
echo '<table class="form-table">';
foreach ($custom_meta_fields as $field) {
// obține valoarea acestui câmp dacă există pentru această postare
$meta = get_post_meta($post->ID, $field['id'], true);
// începe un rând de tabel cu
echo '<tr>
<th><label for="'.$field['id'].'">'.$field['label'].'</label></th>
<td>';
switch($field['type']) {
// elementele case vor fi aici
// 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;
} //încheie switch
echo '</td></tr>';
} // încheie foreach
echo '</table>'; // încheie tabel
}
// Salvează Datele
function save_custom_meta($post_id) {
global $custom_meta_fields;
// verifică nonce
if (!wp_verify_nonce($_POST['custom_meta_box_nonce'], basename(__FILE__)))
return $post_id;
// verifică autosave
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
return $post_id;
// verifică permisiunile
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;
}
// parcurge câmpurile și salvează datele
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);
}
} // încheie foreach
}

Întregul cod este pentru a replica procesul, nu pentru a oferi codul real. Trebuie să vă dați seama cum vă puteți alinia procesul cu acest scenariu. Am adăugat comentarii la fiecare linie posibilă, vă rugăm să consultați comentariile inline pentru a înțelege corect.
Pasul #1
În primul rând, prima porțiune a codului dvs. creează o Casetă Meta personalizată, așa că folosiți această porțiune pentru a vă crea mai întâi caseta meta:
<?php
//crearea casetei meta (Notă: caseta meta != câmp meta personalizat)
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');
?>
Pasul #2
Acum caseta dvs. meta este gata. Acum trebuie să creați câteva câmpuri de formular pentru a obține datele utilizatorului, iar pentru asta folosim funcția $callback
pe care tocmai am declarat-o:
<?php
//afișarea câmpurilor de formular personalizate
function show_custom_meta_box_2() {
global $post;
// Utilizați nonce pentru verificare pentru a securiza trimiterea datelor
wp_nonce_field( basename( __FILE__ ), 'wpse_our_nonce' );
?>
<!-- valoarea mea personalizată pentru input -->
<input type="number" name="wpse_value" value="">
<?php
}
?>
Pasul #3
La salvarea postării, cele două câmpuri vor trimite valori prin post
, acum trebuie să le salvăm unde dorim să le salvăm.
<?php
//acum salvăm datele
function wpse_save_meta_fields( $post_id ) {
// verificare nonce
if (!isset($_POST['wpse_our_nonce']) || !wp_verify_nonce($_POST['wpse_our_nonce'], basename(__FILE__)))
return 'nonce neverificat';
// verificare autosave
if ( wp_is_post_autosave( $post_id ) )
return 'autosave';
//verificare revizie postare
if ( wp_is_post_revision( $post_id ) )
return 'revizie';
// verificare permisiuni
if ( 'project' == $_POST['post_type'] ) {
if ( ! current_user_can( 'edit_page', $post_id ) )
return 'nu se poate edita pagina';
} elseif ( ! current_user_can( 'edit_post', $post_id ) ) {
return 'nu se poate edita postarea';
}
//verificările noastre de bază sunt terminate, acum putem prelua ceea ce am trimis din formularul nostru nou creat
$wpse_value = $_POST['wpse_value'];
//pur și simplu trebuie să salvăm datele acum
global $wpdb;
$table = $wpdb->base_prefix . 'project_bids_mitglied';
$wpdb->insert(
$table,
array(
'col_post_id' => $post_id, //deoarece îl avem în mod implicit cu această funcție
'col_value' => intval( $wpse_value ) //presupunând că trimitem o valoare numerică
),
array(
'%d', //%s - string, %d - întreg, %f - float
'%d', //%s - string, %d - întreg, %f - float
)
);
}
add_action( 'save_post', 'wpse_save_meta_fields' );
add_action( 'new_to_publish', 'wpse_save_meta_fields' );
?>
Deoarece aveți de-a face cu un tabel personalizat, folosim clasa $wpdb pentru a stoca în siguranță datele necesare.
Vă rugăm să rețineți, acesta nu este codul de care aveți nevoie, aceasta este ideea și procesul prin care vă puteți modela acum calea. Amintiți-vă doar două lucruri:
show_custom_meta_box_2()
este zona unde se află formularul dvs. HTML, tratați această parte ca pe un simplu formular HTML, șiwpse_save_meta_fields()
conectată la acțiunile necesare, va salva datele formularului când postarea este publicată / salvată / actualizată. Aplicați aici o sanitizare și validare adecvate.
Sper că vă ajută. Mulțumiri către @toscho pentru discuția recentă. <3
