1

Help me please.. I have plugin for vacancy/resume/companies in the form of posts on Wordpress.

The task is to perform a standard Wordpress search for arbitrary fields inside the record. The fields themselves are output in CMB2.

The search works by taxonomy and record name, but not by an arbitrary field.

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

Inside the plugin, on the companies display page, there was a search function by taxonomy and name. I added an additional field search, but without success.

<?php

class PNJobCompany extends PNJobForm {

private static $_instance;

private function __construct()
{
    $this->includes();
    $this->initHook();
}

private function includes()
{
}

private function initHook()
{
    add_filter('template_include', [$this, 'templateInclude']);
    add_action('wp_loaded', [$this, 'formHandler'], 20);

    add_filter('build_company_seach_query', [$this, 'buildCompanySearchQuery'], 10, 3);
    add_filter('wp_dropdown_users', [$this, 'userDropdown']);
}


public function templateInclude($template)
{
    if (is_company_list_page()) {
        $template = pnj_get_template('company/company-list', null, false);
    }
    return $template;
}


public function formHandler()
{
    if (isset($_POST['pnj_action']) && !empty($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'pnj')) {
        switch ($_POST['pnj_action']) {
            case 'create-company':
                $this->createHandler();
                break;
            case 'edit-company':
                $this->editHandler();
                break;
            case "delete-company":
                //$this->deleteHandler();
                break;
        }
    }
}

/--The search starts here--/

function searchJoinFilter($where)
{
    global $wpdb;

    if (!empty($_REQUEST['query'])) {
        $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql($wpdb->esc_like(trim($_REQUEST['query']))) . '%\'';
    }
    
    return $where;
}


/**
 * @param $posts_per_page
 * @param $paged
 * @return object WP_Query
 */
public function buildCompanySearchQuery($posts_per_page, $paged)
{
    $query = [
        'post_status' => 'publish',
        'post_type' => 'company',
        'posts_per_page' => $posts_per_page,
        'paged' => $paged
    ];

    //City
    if (!empty($_REQUEST['location'])) {
        $query['tax_query'] = [
            'relation' => 'AND',
            [
                'taxonomy' => 'job-location',
                'field' => 'term_id',
                'terms' => $_REQUEST['location'],
                'compare' => 'IN'
            ]
        ];
    }
   //My search inn_company
    if (!empty($_REQUEST['company-inn'])) {
        $meta_query = [
                'key' => 'company_inn',
                'field' => 'meta_value',
                'value' => $_REQUEST['company-inn'],
                'compare' => '='
            ];
        $query['meta_query'] = $meta_query;
    }

    add_filter('posts_where', [$this, 'searchJoinFilter']);

    $result = new WP_Query($query);

    // Удаляем условие, чтобы другие вызовы WP_Query() не затрагивать
    remove_filter('posts_where', [$this, 'searchJoinFilter']);

    return $result;
}

/--End search here--/

public function initFields()
{
    $this->fields = [
        'post_title' => $_POST['title'] ?? '',
        'post_content' => $_POST['description'] ?? '',
        'employer_category' => $_POST['employer_category'] ?? '1',
        'company_email' => $_POST['company_email'] ?? '',
        'company_phone' => $_POST['company_phone'] ?? '',
        'company_inn' => $_POST['company_inn'] ?? '',
        'company_url' => $_POST['company_url'] ?? '',
        'company_address' => $_POST['company_address'] ?? '',

        'category' => $_POST['categories'] ?? '',
        'location' => $_POST['location'] ?? '',
        'company_form' => $_POST['company_form'] ?? '',
        'metro' => $_POST['metro'] ?? '',

    ];

}

protected function validateFields()
{
    foreach ($this->fields as $key => $value) {

        switch ($key) {
            case 'post_title':
                if ($this->fields[$key] === '')
                    $this->addError('Пожалуйста, укажите название компании');
                break;
            case 'company_inn':
                if (empty($this->fields[$key]))
                    $this->addError('Пожалуйста, введите идентификатор Федеральной налоговой службы вашей компании');
                elseif (!preg_match('/^\d{10}$/', $this->fields[$key]))
                    $this->addError('Идентификатор Федеральной налоговой службы должен состоять из 10 цифр');
                break;
            case 'company_email':
                if ($this->fields[$key] !== '' && !is_email($this->fields[$key]))
                    $this->addError('Неверный формат email');
                // TODO Реализовать проверку за занятость email, тем самым запретить регистрацию нескольких компаний на одни email
                break;
            case 'company_phone':
                if (empty($this->fields[$key])) {
                    $this->addError('Поле "Телефон" не божет быть пустым');
                }

                if (!$this->fields[$key] = format_phone($this->fields[$key])) {
                    $this->addError('Неверный формат телефона');
                }
                break;
            case 'employer_category':
                if (empty($this->fields['employer_category']))
                    $this->addError('Пожалуйста, укажите тип работодателя');
                break;
            case 'categories':
                if (empty($this->fields['categories']))
                    $this->addError('Пожалуйста, укажите отрсль компании');
                break;
            case 'location':
                if (empty($this->fields['location']))
                    $this->addError('Пожалуйста, укажите город');
                break;
        }
    }
}

public function createHandler()
{
    $user_id = get_current_user_id();

    try {

        if (empty($_POST['phone_prefix']) || empty($_POST['phone_code']) || empty($_POST['phone_number'])) {
            $this->addError('Неверно указан телефон');
        }

        $_POST['company_phone'] = $_POST['phone_prefix'] . $_POST['phone_code'] . $_POST['phone_number'] . $_POST['phone_extension'];

        $this->initFields();

        $this->validateFields();

        if (!empty($this->errors)) {
            throw new Exception(implode('<br>', $this->errors));
        }

        $company_id = wp_insert_post([
            'post_title' => sanitize_text_field($this->fields['post_title']),
            'post_type' => 'company',
            'post_status' => 'publish',
            'post_author' => $user_id,
            'post_content' => wp_kses_post($this->fields['post_content']),
            'comment_status' => 'open'
        ]);

        if (is_wp_error($company_id)) {
            throw new Exception($company_id->get_error_message());
        } else {

            $fields = ['company_url', 'company_inn', 'company_email', 'company_phone', 'employer_category', 'company_address'];
            foreach ($fields as $field) {
                if (isset($_POST[$field])) {
                    update_metadata('company', $company_id, '_' . $field, sanitize_text_field($this->fields[$field]));
                }
            }

            $taxonomies = [ 
                'category' => 'job-category',
                'company_form' => 'company-form',
                'metro' => 'job-metro'
            ];
            foreach ($taxonomies as $field => $taxonomy) {
                wp_set_post_terms($company_id, $this->fields[$field], $taxonomy);
            }

            // set logo as featured
            if (isset($_POST['company_logo'])) {
                $logo_id = $_POST['company_logo'];
                set_post_thumbnail($company_id, $logo_id);
            }

            pnj_flash_message(
                'message',
                'Новая компания успешно создана',
                'alert-success'
            );

            $redirect = pnj_get_account_link('edit-company');
            if (!empty($_REQUEST['redirect'])) {
                $redirect = $_REQUEST['redirect'];
            }
            wp_redirect($redirect);
            exit;

        }
    } catch (Exception $e) {

        pnj_flash_message('message', $e->getMessage(), 'alert-danger');

    }
}

public function editHandler()
{

    if (!isset($_POST['company_id']))
        return;

    $this->initFields();

    $user_id = get_current_user_id();
    $company_id = $_POST['company_id'];
    $company = get_post($company_id);

    try {
        $this->validateFields();

        if ($company->post_type !== 'company') {
            $this->addError('Не верный тип поста');
        }

        if ($company->post_author != $user_id && !is_user_role('administrator')) {
            $this->addError('У вас нет прав для редактирования этой компании');
        }

        if (!empty($this->errors)) {
            throw new Exception(implode('<br>', $this->errors));
        }

        wp_update_post([
            'ID' => $company_id,
            'post_title' => sanitize_text_field($this->fields['post_title']),
            'post_content' => wp_kses_post($this->fields['post_content'])
        ]);

        $fields = [
            'company_email',
            'company_phone',
            'company_inn',
            'company_url',
            'employer_category',
            'company_address'
        ];

        foreach ($fields as $field) {
            update_metadata('company', $company_id, sanitize_text_field('_' . $field), $this->fields[$field]);
        }

        $taxonomies = [
            'inn' => 'company_inn',
            'location' => 'job-location',
            'category' => 'job-category',
            'company_form' => 'company-form',
            'metro' => 'job-metro'
        ];

        wp_delete_object_term_relationships($company_id, $taxonomies);

        foreach ($taxonomies as $field => $taxonomy) {
            wp_set_post_terms($company_id, $this->fields[$field], $taxonomy);
        }


        if (isset($_POST['company_logo'])) {
            $logo_id = $_POST['company_logo'];
            if ($logo_id !== '')
                set_post_thumbnail($company_id, $logo_id);
            else
                delete_post_thumbnail($company_id);
        }

        pnj_flash_message(
            'message',
            'Компания успешно отредактирована',
            'alert-success'
        );

        $redirect = pnj_get_account_link('edit_company');
        if (!empty($_REQUEST['redirect'])) {
            $redirect = $_REQUEST['redirect'];
        }
        wp_redirect($redirect);
        exit;

    } catch (Exception $e) {
        pnj_flash_message('message', $e->getMessage(), 'alert-danger');
    }
}

/**
 * @return object PNJobCompany
 */
public static function instance()
{
    if (is_null(self::$_instance)) {
        self::$_instance = new self();
    }

    return self::$_instance;
}

public function userDropdown($output)
{
    global $post;

    if ($post->post_type === 'company') {
        $output = str_replace('</select>', '', $output);
        $users = get_users(['role' => PNJobAccount::EMPLOYER]);
        foreach ($users as $user) {
            if ($post->post_author == $user->ID) {
                continue;
            }

            $output .= '<option value="' . $user->ID . '">' . sprintf(_x('%1$s (%2$s)', 'user dropdown'), $user->display_name, $user->user_login) . '</option>';
        }
        $output .= "</select>";
    }

    return $output;
}

}

PNJobCompany::instance();

2
  • can you reword/rephrase your question? It's very difficult to understand and skips past a lot of explanation. For example you mentioned the search is not working and share code but never explain what the search is/does or where it comes from. You also highlighted yellow boxes in the screenshot but never explained what they were. Use the edit link to adjust and improve your question so it's answerable.
    – Tom J Nowell
    Feb 9 at 11:55
  • @TomJNowell thanks, i fixed Feb 9 at 15:33

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.