Formular simplu care salvează în baza de date
Folosesc un serviciu terț care verifică baza mea de date pentru intrări noi într-un tabel specific. Cu toate acestea, nu am reușit să găsesc un plugin simplu pentru formulare care să trimită date în baza de date WordPress într-un tabel care să nu afecteze funcționalitatea WordPress. Motivul este că furnizorul meu de hosting îmi permite doar o singură bază de date.
Am nevoie să folosesc un formular în WordPress care:
- Captează numele, telefonul și emailul trimis de utilizatorul final
- Salvează în baza de date
- Redirecționează utilizatorul către o pagină de confirmare
Nimic elaborat de fapt și deși ar fi grozav să văd rezultatele în administrarea WordPress, nu este neapărat necesar deoarece pot folosi phpMyAdmin.
Pe scurt:
Am nevoie de un formular simplu html/php, unde pot doar să lipesc codul HTML al formularului pe o pagină prin intermediul administrării WordPress prin vizualizarea html/cod pentru pagini. Când un utilizator trimite formularul, acesta salvează datele în baza de date WordPress și apoi redirecționează utilizatorul către o pagină de "mulțumire".

Din câte înțeleg, deja ai tabelul în baza ta de date.
Nu știu cum l-ai denumit, dar o practică recomandată (pentru mine, una obligatorie) este să-l numești cu același prefix de tabel ca în WordPress, acela setat în wp-config.php
.
De asemenea, nu menționezi cum este structurat acest tabel, dar presupun că arată cam așa:
ID (integer,primary,autoincrement) | name (varchar) | phone (varchar) | email (varchar)
Poți adăuga un shortcode care să afișeze formularul. În fișierul tău functions.php
adaugă:
add_action('init', function() {
add_shortcode('userform', 'print_user_form');
});
function print_user_form() {
echo '<form method="POST">';
wp_nonce_field('user_info', 'user_info_nonce', true, true);
?>
Toate câmpurile tale din formular (nume, email, telefon) merg aici.
<?php
submit_button('Trimite Date');
echo '</form>';
}
Acum creează un articol sau o pagină în panoul de administrare WordPress și pur și simplu adaugă [userform]
: formularul va fi afișat magic în pagină.
După cum poți observa, nu am adăugat atributul action la formular, astfel formularul trimite datele POST către aceeași pagină.
Acum trebuie să salvezi datele. Adaugă o acțiune într-un hook timpuriu, verifică $_POST
, verifică nonce-ul și salvează datele:
add_action('template_redirect', function() {
if ( ( is_single() || is_page() ) &&
isset($_POST[user_info_nonce]) &&
wp_verify_nonce($_POST[user_info_nonce], 'user_info')
) {
// ar trebui să faci validarea înainte de a salva datele în baza de date.
// Nu voi scrie funcția de validare, este în afara domeniului acestui răspuns
$pass_validation = validate_user_data($_POST);
if ( $pass_validation ) {
$data = array(
'name' => $_POST['name'],
'email' => $_POST['email'],
'phone' => $_POST['phone'],
);
global $wpdb;
// dacă ai urmat sugestia mea de a denumi tabelul folosind prefixul WordPress
$table_name = $wpdb->prefix . 'my_custom_table';
// următoarea linie va insera datele
$wpdb->insert($table_name, $data, '%s');
// dacă vrei să obții valoarea ID-ului pentru rândul tocmai inserat, folosește
$rowid = $wpdb->insert_id;
// după inserare, trebuie să redirecționăm utilizatorul
// Îți sugerez să creezi o altă pagină și să o intitulezi "Mulțumim"
// dacă faci asta:
$redirect_page = get_page_by_title('Mulțumim') ? : get_queried_object();
// linia anterioară, dacă pagina intitulată 'Mulțumim' nu este găsită, setează pagina curentă
// ca pagină de redirecționare. Următoarea linie obține URL-ul paginii de redirecționare:
$redirect_url = get_permalink( $redirect_page );
// acum redirecționează
wp_safe_redirect( $redirect_url );
// și oprește PHP
exit();
}
}
});
Codul este simplist, dar ar trebui să fie un punct de plecare valid. Comentariile inline ar trebui să te ajute să înțelegi fluxul de lucru.
Asigură-te că citești documentația:

Mulțumesc pentru răspunsul extrem de detaliat. E foarte mult de digerat, voi reveni cu rezultatele mele și vă mulțumesc din nou.

Întrebări rapide: 1. Dacă aș avea nevoie de mai mult de un formular, există vreo modalitate de a adăuga un nume la shortcode, cum ar fi [userform:FormA] sau [userform:Contact], care ar adăuga FormA la clasa ID a câmpului formularului HTML, precum și ar include FormA într-un câmp ascuns în formular? 2. Pentru al doilea bloc de cod, acesta ar trebui pus și în fișierul functions.php? 3. Ce parte din al doilea exemplu de cod face ca WordPress să știe să execute această funcționalitate doar pe formularele create prin această metodă? Nu văd nicio modalitate prin care să verifice dacă trimiterea formularului provine de la formularul creat prin shortcode.

(1) ceea ce ai nevoie este shortcode atts folosindu-le poți personaliza formularul după cum dorești, vezi documentația add_shortcode
linkată în răspuns. (2) Da. Codul care începe cu add_filter
sau add_action
trebuie să-l incluzi într-un plugin sau în functions.php
: depinde dacă vrei/poți pierde această funcționalitate la schimbarea temei. (3) motivul pentru wp_verify_nonce
este exact acesta. Verifică o variabilă $_POST
(creată de wp_nonce_field
) care conține o valoare criptată generată dintr-un șir simplu, în acest caz 'user_info'. Consultă din nou documentația linkată la sfârșitul răspunsului. @Damainman

o întrebare rapidă, ai un tag de închidere php în partea de sus și un tag de deschidere php spre finalul funcției tale de shortcode. Poți verifica de ce este configurat astfel?

@Damainman "Toate câmpurile tale de formular (nume, email, telefon) merg aici." este menit să fie un substituent pentru partea de html a formularului, așa că închid tag-urile php înainte și le redeschid după pentru a evita o succesiune lungă și urâtă de echo
. Pur și simplu scrie html acolo așa cum faci de obicei.
