Blog

  • 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\d+)’, array(
    ‘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\d+)’, array(
    ‘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);
    ?>


    Empresas