register_post_types();
$this->register_taxonomies();
flush_rewrite_rules();
}
public function register_post_types() {
// Companies CPT
register_post_type(‘company’, array(
‘labels’ => array(
‘name’ => __(‘Empresas’,’rede-avicola’),
‘singular_name’ => __(‘Empresa’,’rede-avicola’)
),
‘public’ => true,
‘has_archive’ => true,
‘show_in_rest’ => true,
‘supports’ => array(‘title’,’editor’,’thumbnail’,’excerpt’,’custom-fields’),
‘rewrite’ => array(‘slug’=>’companies’),
‘menu_icon’ => ‘dashicons-building’,
));
// Equipments CPT
register_post_type(‘equipment’, array(
‘labels’ => array(
‘name’ => __(‘Equipamentos’,’rede-avicola’),
‘singular_name’ => __(‘Equipamento’,’rede-avicola’)
),
‘public’ => true,
‘has_archive’ => true,
‘show_in_rest’ => true,
‘supports’ => array(‘title’,’editor’,’thumbnail’,’excerpt’,’custom-fields’),
‘rewrite’ => array(‘slug’=>’equipments’),
‘menu_icon’ => ‘dashicons-admin-tools’,
));
// Requests CPT (leads/pedidos)
register_post_type(‘ra_request’, array(
‘labels’ => array(
‘name’ => __(‘Pedidos’,’rede-avicola’),
‘singular_name’ => __(‘Pedido’,’rede-avicola’)
),
‘public’ => false,
‘show_ui’ => true,
‘show_in_rest’ => true,
‘supports’ => array(‘title’,’editor’,’custom-fields’),
‘menu_icon’ => ‘dashicons-list-view’,
));
}
public function register_taxonomies() {
register_taxonomy(‘ra_category’, array(‘equipment’), array(
‘label’ => __(‘Categorias’,’rede-avicola’),
‘rewrite’ => array(‘slug’=>’ra-category’),
‘hierarchical’ => true,
‘show_in_rest’ => true,
));
}
/* ———- Meta boxes for Company & Equipment ———- */
public function add_meta_boxes() {
add_meta_box(‘company_meta’, ‘Informações da Empresa’, array($this,’company_meta_box_cb’), ‘company’, ‘normal’, ‘high’);
add_meta_box(‘equipment_meta’, ‘Dados do Equipamento’, array($this,’equipment_meta_box_cb’), ‘equipment’, ‘normal’, ‘high’);
}
public function company_meta_box_cb($post) {
wp_nonce_field(‘ra_company_meta’, ‘ra_company_meta_nonce’);
$city = get_post_meta($post->ID, ‘_ra_city’, true);
$state = get_post_meta($post->ID, ‘_ra_state’, true);
$phone = get_post_meta($post->ID, ‘_ra_phone’, true);
$email = get_post_meta($post->ID, ‘_ra_email’, true);
$cnpj = get_post_meta($post->ID, ‘_ra_cnpj’, true);
?>
post_type === ‘company’) {
if (!isset($_POST[‘ra_company_meta_nonce’]) || !wp_verify_nonce($_POST[‘ra_company_meta_nonce’], ‘ra_company_meta’)) return;
if (defined(‘DOING_AUTOSAVE’) && DOING_AUTOSAVE) return;
update_post_meta($post_id, ‘_ra_phone’, sanitize_text_field($_POST[‘ra_phone’] ?? ”));
update_post_meta($post_id, ‘_ra_email’, sanitize_email($_POST[‘ra_email’] ?? ”));
update_post_meta($post_id, ‘_ra_city’, sanitize_text_field($_POST[‘ra_city’] ?? ”));
update_post_meta($post_id, ‘_ra_state’, sanitize_text_field($_POST[‘ra_state’] ?? ”));
update_post_meta($post_id, ‘_ra_cnpj’, sanitize_text_field($_POST[‘ra_cnpj’] ?? ”));
}
// Equipments
if ($post->post_type === ‘equipment’) {
if (!isset($_POST[‘ra_equipment_meta_nonce’]) || !wp_verify_nonce($_POST[‘ra_equipment_meta_nonce’], ‘ra_equipment_meta’)) return;
if (defined(‘DOING_AUTOSAVE’) && DOING_AUTOSAVE) return;
update_post_meta($post_id, ‘_ra_company_id’, intval($_POST[‘ra_company_id’] ?? 0));
update_post_meta($post_id, ‘_ra_price’, sanitize_text_field($_POST[‘ra_price’] ?? ”));
update_post_meta($post_id, ‘_ra_available’, $_POST[‘ra_available’] === ‘1’ ? ‘1’ : ‘0’);
}
}
/* ———- REST API Routes ———- */
public function register_rest_routes() {
register_rest_route(‘rede-avicola/v1’, ‘/companies’, array(
‘methods’ => ‘GET’,
‘callback’ => array($this, ‘rest_get_companies’),
‘permission_callback’ => ‘__return_true’,
));
register_rest_route(‘rede-avicola/v1’, ‘/equipments’, array(
‘methods’ => ‘GET’,
‘callback’ => array($this, ‘rest_get_equipments’),
‘permission_callback’ => ‘__return_true’,
));
register_rest_route(‘rede-avicola/v1’, ‘/equipment/(?P
‘methods’ => ‘GET’,
‘callback’ => array($this, ‘rest_get_equipment’),
‘permission_callback’ => ‘__return_true’,
));
register_rest_route(‘rede-avicola/v1’, ‘/request’, array(
‘methods’ => ‘POST’,
‘callback’ => array($this, ‘rest_create_request’),
‘permission_callback’ => ‘__return_true’,
‘args’ => array(
‘equipment_id’ => array(‘required’ => true),
‘company_id’ => array(‘required’ => true),
‘client_name’ => array(‘required’ => true),
‘client_email’ => array(‘required’ => true),
‘client_phone’ => array(‘required’ => false),
‘details’ => array(‘required’ => false),
‘proposed_date’ => array(‘required’ => false),
),
));
register_rest_route(‘rede-avicola/v1’, ‘/requests/company/(?P
‘methods’ => ‘GET’,
‘callback’ => array($this, ‘rest_get_requests_by_company’),
‘permission_callback’ => function() {
// Only allow admin or logged users in production, here true for demo
return current_user_can(‘manage_options’) || is_user_logged_in();
},
));
}
public function rest_get_companies($request) {
$args = array(
‘post_type’ => ‘company’,
‘posts_per_page’ => 50,
‘post_status’ => ‘publish’,
);
// optional q param
$q = sanitize_text_field($request->get_param(‘q’) ?? ”);
if ($q) $args[‘s’] = $q;
$query = new WP_Query($args);
$data = array();
foreach ($query->posts as $p) {
$data[] = $this->company_to_array($p);
}
return rest_ensure_response($data);
}
public function rest_get_equipments($request) {
$args = array(
‘post_type’ => ‘equipment’,
‘posts_per_page’ => 50,
‘post_status’ => ‘publish’,
);
$q = sanitize_text_field($request->get_param(‘q’) ?? ”);
$company = intval($request->get_param(‘company’) ?? 0);
if ($q) $args[‘s’] = $q;
if ($company) $args[‘meta_query’] = array(array(‘key’=>’_ra_company_id’,’value’=>$company,’compare’=>’=’));
$query = new WP_Query($args);
$data = array();
foreach ($query->posts as $p) {
$data[] = $this->equipment_to_array($p);
}
return rest_ensure_response($data);
}
public function rest_get_equipment($request) {
$id = intval($request[‘id’]);
$post = get_post($id);
if (!$post || $post->post_type !== ‘equipment’) return new WP_Error(‘not_found’, ‘Equipamento não encontrado’, array(‘status’=>404));
return rest_ensure_response($this->equipment_to_array($post));
}
public function rest_create_request($request) {
$params = $request->get_params();
$equipment_id = intval($params[‘equipment_id’]);
$company_id = intval($params[‘company_id’]);
$client_name = sanitize_text_field($params[‘client_name’]);
$client_email = sanitize_email($params[‘client_email’]);
$client_phone = sanitize_text_field($params[‘client_phone’] ?? ”);
$details = sanitize_textarea_field($params[‘details’] ?? ”);
$proposed_date = sanitize_text_field($params[‘proposed_date’] ?? ”);
// Basic validations
if (!$equipment_id || !$company_id || !$client_name || !$client_email) {
return new WP_Error(‘invalid’, ‘Parâmetros inválidos’, array(‘status’=>422));
}
// Create a ra_request post
$title = “Pedido – {$client_name} – Equip #{$equipment_id}”;
$post_id = wp_insert_post(array(
‘post_type’ => ‘ra_request’,
‘post_title’ => wp_strip_all_tags($title),
‘post_content’ => $details,
‘post_status’ => ‘publish’,
‘meta_input’ => array(
‘_ra_equipment_id’ => $equipment_id,
‘_ra_company_id’ => $company_id,
‘_ra_client_name’ => $client_name,
‘_ra_client_email’ => $client_email,
‘_ra_client_phone’ => $client_phone,
‘_ra_proposed_date’ => $proposed_date,
‘_ra_status’ => ‘new’,
)
));
if (is_wp_error($post_id) || !$post_id) {
return new WP_Error(‘server_error’, ‘Erro ao criar pedido’, array(‘status’=>500));
}
// Notify company by email (if has email meta)
$company_email = get_post_meta($company_id, ‘_ra_email’, true);
$company_title = get_the_title($company_id);
$equipment_title = get_the_title($equipment_id);
if ($company_email) {
$subject = “Novo pedido de {$client_name} – {$equipment_title}”;
$message = “Você recebeu um novo pedido.\n\nCliente: {$client_name}\nEmail: {$client_email}\nTelefone: {$client_phone}\nEquipamento: {$equipment_title}\nDetalhes: {$details}\n\nVer no painel: ” . admin_url(“post.php?post={$post_id}&action=edit”);
wp_mail($company_email, $subject, $message);
}
return rest_ensure_response(array(‘success’ => true, ‘request_id’ => $post_id));
}
public function rest_get_requests_by_company($request) {
$company_id = intval($request[‘company_id’]);
$args = array(
‘post_type’ => ‘ra_request’,
‘posts_per_page’ => 50,
‘meta_query’ => array(
array(‘key’=>’_ra_company_id’,’value’=>$company_id,’compare’=>’=’)
)
);
$q = new WP_Query($args);
$data = array();
foreach ($q->posts as $p) {
$data[] = array(
‘id’ => $p->ID,
‘title’ => $p->post_title,
‘content’ => $p->post_content,
‘meta’ => get_post_meta($p->ID),
);
}
return rest_ensure_response($data);
}
/* ———- Helpers ———- */
private function company_to_array($post) {
return array(
‘id’ => $post->ID,
‘title’ => get_the_title($post),
‘content’ => apply_filters(‘the_content’, $post->post_content),
‘excerpt’ => get_the_excerpt($post),
‘meta’ => array(
‘phone’ => get_post_meta($post->ID, ‘_ra_phone’, true),
’email’ => get_post_meta($post->ID, ‘_ra_email’, true),
‘city’ => get_post_meta($post->ID, ‘_ra_city’, true),
‘state’ => get_post_meta($post->ID, ‘_ra_state’, true),
‘cnpj’ => get_post_meta($post->ID, ‘_ra_cnpj’, true),
),
‘permalink’ => get_permalink($post),
‘thumbnail’ => get_the_post_thumbnail_url($post, ‘medium’),
);
}
private function equipment_to_array($post) {
return array(
‘id’ => $post->ID,
‘title’ => get_the_title($post),
‘content’ => apply_filters(‘the_content’, $post->post_content),
‘excerpt’ => get_the_excerpt($post),
‘meta’ => array(
‘company_id’ => get_post_meta($post->ID, ‘_ra_company_id’, true),
‘price’ => get_post_meta($post->ID, ‘_ra_price’, true),
‘available’ => get_post_meta($post->ID, ‘_ra_available’, true),
),
‘permalink’ => get_permalink($post),
‘thumbnail’ => get_the_post_thumbnail_url($post, ‘medium’),
);
}
/* ———- Shortcodes & Front-end ———- */
public function enqueue_assets() {
// Only enqueue on front-end pages where our shortcodes are used (simple check)
wp_register_script(‘rede-avicola-js’, plugin_dir_url(__FILE__) . ‘rede-avicola.js’, array(‘jquery’), ‘1.0’, true);
wp_localize_script(‘rede-avicola-js’, ‘REDE_AVICOLA’, array(
‘api_root’ => esc_url_raw(rest_url(‘rede-avicola/v1/’)),
‘nonce’ => wp_create_nonce(‘wp_rest’),
));
wp_register_style(‘rede-avicola-css’, plugin_dir_url(__FILE__) . ‘rede-avicola.css’);
wp_enqueue_script(‘rede-avicola-js’);
wp_enqueue_style(‘rede-avicola-css’);
}
public function shortcode_marketplace($atts = []) {
// Render a search + equipment listing container. JS will fetch via REST.
ob_start();
?>
Marketplace / Equipamentos
post_type !== ‘company’) {
echo ‘
Empresa não encontrada.
‘;
return ob_get_clean();
}
$company = $this->company_to_array($post);
?>