288 lines
15 KiB
PHP
288 lines
15 KiB
PHP
<?php
|
||
/**
|
||
* Plugin Name: ABC Leads & ESG Evaluation
|
||
* Description: Lightweight lead capture and preliminary ESG evaluation forms for Avangarde Bright Concepts.
|
||
* Version: 1.0.0
|
||
* Author: Flatlogic Site Engineer
|
||
*/
|
||
|
||
if (!defined('ABSPATH')) { exit; }
|
||
|
||
final class ABC_Leads_Plugin {
|
||
const CPT = 'abc_submission';
|
||
|
||
public static function init() {
|
||
add_action('init', [__CLASS__, 'register_cpt']);
|
||
add_shortcode('abc_contact_form', [__CLASS__, 'contact_form']);
|
||
add_shortcode('abc_esg_assessment', [__CLASS__, 'assessment_form']);
|
||
add_action('wp_enqueue_scripts', [__CLASS__, 'assets']);
|
||
add_action('admin_post_nopriv_abc_submit_contact', [__CLASS__, 'handle_contact']);
|
||
add_action('admin_post_abc_submit_contact', [__CLASS__, 'handle_contact']);
|
||
add_action('admin_post_nopriv_abc_submit_assessment', [__CLASS__, 'handle_assessment']);
|
||
add_action('admin_post_abc_submit_assessment', [__CLASS__, 'handle_assessment']);
|
||
add_filter('manage_' . self::CPT . '_posts_columns', [__CLASS__, 'columns']);
|
||
add_action('manage_' . self::CPT . '_posts_custom_column', [__CLASS__, 'column_content'], 10, 2);
|
||
add_filter('manage_edit-' . self::CPT . '_sortable_columns', [__CLASS__, 'sortable_columns']);
|
||
}
|
||
|
||
public static function register_cpt() {
|
||
register_post_type(self::CPT, [
|
||
'labels' => [
|
||
'name' => 'ABC Leads',
|
||
'singular_name' => 'ABC Lead',
|
||
'menu_name' => 'ABC Leads',
|
||
'add_new_item' => 'Add Lead',
|
||
'edit_item' => 'View Lead',
|
||
],
|
||
'public' => false,
|
||
'show_ui' => true,
|
||
'show_in_menu' => true,
|
||
'menu_icon' => 'dashicons-chart-line',
|
||
'supports' => ['title', 'editor', 'custom-fields'],
|
||
'capability_type' => 'post',
|
||
]);
|
||
}
|
||
|
||
public static function assets() {
|
||
wp_enqueue_style('abc-leads', plugin_dir_url(__FILE__) . 'abc-leads.css', [], '1.0.0');
|
||
}
|
||
|
||
|
||
private static function redirect_back($status) {
|
||
$url = wp_get_referer() ?: home_url('/contact/');
|
||
$url = remove_query_arg(['abc_status'], $url);
|
||
wp_safe_redirect(add_query_arg('abc_status', $status, $url));
|
||
exit;
|
||
}
|
||
|
||
public static function handle_contact() {
|
||
if (!isset($_POST['abc_nonce']) || !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['abc_nonce'])), 'abc_contact')) {
|
||
self::redirect_back('invalid');
|
||
}
|
||
$message = sanitize_textarea_field(wp_unslash($_POST['message'] ?? ''));
|
||
$fields = [
|
||
'name' => self::clean('name'),
|
||
'company' => self::clean('company'),
|
||
'email' => sanitize_email(wp_unslash($_POST['email'] ?? '')),
|
||
'phone' => self::clean('phone'),
|
||
'interest' => self::clean('interest'),
|
||
'newsletter' => isset($_POST['newsletter']) ? 'Da' : 'Nu',
|
||
];
|
||
if (!$fields['name'] || !$fields['email']) { self::redirect_back('missing'); }
|
||
$saved = self::save_submission('Solicitare consultanță', $fields, $message);
|
||
self::redirect_back(is_wp_error($saved) ? 'error' : 'contact_success');
|
||
}
|
||
|
||
public static function handle_assessment() {
|
||
if (!isset($_POST['abc_nonce']) || !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['abc_nonce'])), 'abc_assessment')) {
|
||
self::redirect_back('invalid');
|
||
}
|
||
$message = sanitize_textarea_field(wp_unslash($_POST['notes'] ?? ''));
|
||
$fields = [
|
||
'name' => self::clean('name'),
|
||
'company' => self::clean('company'),
|
||
'email' => sanitize_email(wp_unslash($_POST['email'] ?? '')),
|
||
'company_size' => self::clean('company_size'),
|
||
'request_source' => self::clean('request_source'),
|
||
'topics' => self::clean('topics'),
|
||
'timeline' => self::clean('timeline'),
|
||
];
|
||
if (!$fields['company'] || !$fields['email']) { self::redirect_back('missing'); }
|
||
$saved = self::save_submission('Evaluare ESG preliminară', $fields, $message);
|
||
self::redirect_back(is_wp_error($saved) ? 'error' : 'assessment_success');
|
||
}
|
||
|
||
private static function status_notice($context) {
|
||
$status = isset($_GET['abc_status']) ? sanitize_key(wp_unslash($_GET['abc_status'])) : '';
|
||
if (!$status) { return ''; }
|
||
$messages = [
|
||
'invalid' => ['Nu am putut valida formularul. Vă rugăm să încercați din nou.', 'error'],
|
||
'missing' => ['Completați câmpurile obligatorii marcate cu *.', 'error'],
|
||
'error' => ['A apărut o eroare la trimitere. Vă rugăm să încercați din nou.', 'error'],
|
||
'contact_success' => ['Mulțumim. Solicitarea a fost înregistrată — vă vom contacta pentru discuția inițială.', 'success'],
|
||
'assessment_success' => ['Evaluarea preliminară a fost trimisă. Vom reveni cu pașii recomandați pentru organizarea ESG.', 'success'],
|
||
];
|
||
if (!isset($messages[$status])) { return ''; }
|
||
[$msg, $type] = $messages[$status];
|
||
return self::notice($msg, $type);
|
||
}
|
||
|
||
private static function clean($key) {
|
||
if (!isset($_POST[$key])) { return ''; }
|
||
if (is_array($_POST[$key])) {
|
||
return array_map('sanitize_text_field', wp_unslash($_POST[$key]));
|
||
}
|
||
return sanitize_text_field(wp_unslash($_POST[$key]));
|
||
}
|
||
|
||
private static function save_submission($type, $fields, $message = '') {
|
||
$name = $fields['name'] ?? '';
|
||
$company = $fields['company'] ?? '';
|
||
$email = $fields['email'] ?? '';
|
||
$title = trim($type . ' — ' . ($company ?: $name ?: $email ?: current_time('mysql')));
|
||
$content = $message ? wp_kses_post($message) : '';
|
||
$post_id = wp_insert_post([
|
||
'post_type' => self::CPT,
|
||
'post_status' => 'private',
|
||
'post_title' => $title,
|
||
'post_content' => $content,
|
||
], true);
|
||
if (is_wp_error($post_id)) { return $post_id; }
|
||
update_post_meta($post_id, '_abc_type', $type);
|
||
foreach ($fields as $key => $value) {
|
||
update_post_meta($post_id, '_abc_' . sanitize_key($key), is_array($value) ? implode(', ', $value) : $value);
|
||
}
|
||
update_post_meta($post_id, '_abc_submitted_at', current_time('mysql'));
|
||
return $post_id;
|
||
}
|
||
|
||
private static function notice($text, $type = 'success') {
|
||
return '<div class="abc-form-notice abc-' . esc_attr($type) . '">' . esc_html($text) . '</div>';
|
||
}
|
||
|
||
public static function contact_form() {
|
||
$notice = self::status_notice('contact');
|
||
if (false && $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['abc_form_type']) && $_POST['abc_form_type'] === 'contact') {
|
||
if (!isset($_POST['abc_nonce']) || !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['abc_nonce'])), 'abc_contact')) {
|
||
$notice = self::notice('Nu am putut valida formularul. Vă rugăm să încercați din nou.', 'error');
|
||
} else {
|
||
$message = sanitize_textarea_field(wp_unslash($_POST['message'] ?? ''));
|
||
$fields = [
|
||
'name' => self::clean('name'),
|
||
'company' => self::clean('company'),
|
||
'email' => sanitize_email(wp_unslash($_POST['email'] ?? '')),
|
||
'phone' => self::clean('phone'),
|
||
'interest' => self::clean('interest'),
|
||
'newsletter' => isset($_POST['newsletter']) ? 'Da' : 'Nu',
|
||
];
|
||
if (!$fields['name'] || !$fields['email']) {
|
||
$notice = self::notice('Completați cel puțin numele și adresa de email.', 'error');
|
||
} else {
|
||
$saved = self::save_submission('Solicitare consultanță', $fields, $message);
|
||
$notice = is_wp_error($saved)
|
||
? self::notice('A apărut o eroare la trimitere. Vă rugăm să încercați din nou.', 'error')
|
||
: self::notice('Mulțumim. Solicitarea a fost înregistrată — vă vom contacta pentru discuția inițială.');
|
||
}
|
||
}
|
||
}
|
||
ob_start(); ?>
|
||
<div class="abc-form-wrap">
|
||
<?php echo $notice; ?>
|
||
<form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" class="abc-form">
|
||
<input type="hidden" name="action" value="abc_submit_contact">
|
||
<input type="hidden" name="abc_form_type" value="contact">
|
||
<?php wp_nonce_field('abc_contact', 'abc_nonce'); ?>
|
||
<div class="abc-grid-two">
|
||
<label>Nume și prenume*<input required name="name" type="text" autocomplete="name"></label>
|
||
<label>Companie<input name="company" type="text" autocomplete="organization"></label>
|
||
<label>Email*<input required name="email" type="email" autocomplete="email"></label>
|
||
<label>Telefon<input name="phone" type="tel" autocomplete="tel"></label>
|
||
</div>
|
||
<label>Zona de interes
|
||
<select name="interest">
|
||
<option>Diagnostic ESG</option>
|
||
<option>Solicitare ESG de la bancă / investitor</option>
|
||
<option>DNSH / proiect finanțat</option>
|
||
<option>Organizarea informațiilor ESG</option>
|
||
<option>Monitorizare și suport recurent</option>
|
||
</select>
|
||
</label>
|
||
<label>Mesaj<textarea name="message" rows="5" placeholder="Spuneți-ne ce solicitare ESG ați primit sau ce doriți să organizați."></textarea></label>
|
||
<label class="abc-checkbox"><input type="checkbox" name="newsletter" value="1"> Doresc să primesc resurse ESG utile prin newsletter.</label>
|
||
<button type="submit">Solicită o discuție</button>
|
||
<p class="abc-form-small">Răspunsurile sunt salvate securizat în zona de administrare WordPress pentru follow-up.</p>
|
||
</form>
|
||
</div>
|
||
<?php return ob_get_clean();
|
||
}
|
||
|
||
public static function assessment_form() {
|
||
$notice = self::status_notice('assessment');
|
||
if (false && $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['abc_form_type']) && $_POST['abc_form_type'] === 'assessment') {
|
||
if (!isset($_POST['abc_nonce']) || !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['abc_nonce'])), 'abc_assessment')) {
|
||
$notice = self::notice('Nu am putut valida evaluarea. Vă rugăm să încercați din nou.', 'error');
|
||
} else {
|
||
$message = sanitize_textarea_field(wp_unslash($_POST['notes'] ?? ''));
|
||
$fields = [
|
||
'name' => self::clean('name'),
|
||
'company' => self::clean('company'),
|
||
'email' => sanitize_email(wp_unslash($_POST['email'] ?? '')),
|
||
'company_size' => self::clean('company_size'),
|
||
'request_source' => self::clean('request_source'),
|
||
'topics' => self::clean('topics'),
|
||
'timeline' => self::clean('timeline'),
|
||
];
|
||
if (!$fields['company'] || !$fields['email']) {
|
||
$notice = self::notice('Completați cel puțin compania și adresa de email.', 'error');
|
||
} else {
|
||
$saved = self::save_submission('Evaluare ESG preliminară', $fields, $message);
|
||
$notice = is_wp_error($saved)
|
||
? self::notice('A apărut o eroare la trimitere. Vă rugăm să încercați din nou.', 'error')
|
||
: self::notice('Evaluarea preliminară a fost trimisă. Vom reveni cu pașii recomandați pentru organizarea ESG.');
|
||
}
|
||
}
|
||
}
|
||
ob_start(); ?>
|
||
<div class="abc-form-wrap abc-assessment">
|
||
<?php echo $notice; ?>
|
||
<form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" class="abc-form">
|
||
<input type="hidden" name="action" value="abc_submit_assessment">
|
||
<input type="hidden" name="abc_form_type" value="assessment">
|
||
<?php wp_nonce_field('abc_assessment', 'abc_nonce'); ?>
|
||
<div class="abc-grid-two">
|
||
<label>Companie*<input required name="company" type="text"></label>
|
||
<label>Persoană de contact<input name="name" type="text"></label>
|
||
<label>Email*<input required name="email" type="email"></label>
|
||
<label>Dimensiune companie
|
||
<select name="company_size"><option>IMM / antreprenorială</option><option>Companie medie</option><option>Companie mare</option><option>Grup internațional</option></select>
|
||
</label>
|
||
</div>
|
||
<label>De unde vine presiunea ESG?
|
||
<select name="request_source"><option>Bancă / finanțator</option><option>Client sau partener comercial</option><option>Program de finanțare</option><option>Autoritate / reglementare</option><option>Pregătire internă voluntară</option></select>
|
||
</label>
|
||
<fieldset><legend>Ce informații trebuie organizate?</legend>
|
||
<label><input type="checkbox" name="topics[]" value="Energie"> Energie</label>
|
||
<label><input type="checkbox" name="topics[]" value="Emisii"> Emisii GES</label>
|
||
<label><input type="checkbox" name="topics[]" value="Deșeuri"> Deșeuri / reciclare</label>
|
||
<label><input type="checkbox" name="topics[]" value="Politici ESG"> Politici și proceduri ESG</label>
|
||
<label><input type="checkbox" name="topics[]" value="DNSH"> DNSH / proiect finanțat</label>
|
||
</fieldset>
|
||
<label>Termen estimat
|
||
<select name="timeline"><option>Urgent — sub 2 săptămâni</option><option>1 lună</option><option>1–3 luni</option><option>Planificare pentru viitor</option></select>
|
||
</label>
|
||
<label>Context / observații<textarea name="notes" rows="5" placeholder="Ex.: am primit un chestionar ESG de la bancă sau pregătim o finanțare."></textarea></label>
|
||
<button type="submit">Trimite evaluarea preliminară</button>
|
||
</form>
|
||
</div>
|
||
<?php return ob_get_clean();
|
||
}
|
||
|
||
public static function columns($columns) {
|
||
return [
|
||
'cb' => $columns['cb'],
|
||
'title' => 'Lead',
|
||
'abc_type' => 'Tip',
|
||
'abc_company' => 'Companie',
|
||
'abc_email' => 'Email',
|
||
'date' => 'Data',
|
||
];
|
||
}
|
||
|
||
public static function column_content($column, $post_id) {
|
||
$map = [
|
||
'abc_type' => '_abc_type',
|
||
'abc_company' => '_abc_company',
|
||
'abc_email' => '_abc_email',
|
||
];
|
||
if (isset($map[$column])) {
|
||
echo esc_html(get_post_meta($post_id, $map[$column], true));
|
||
}
|
||
}
|
||
|
||
public static function sortable_columns($columns) {
|
||
$columns['abc_type'] = 'abc_type';
|
||
return $columns;
|
||
}
|
||
}
|
||
ABC_Leads_Plugin::init();
|