Каким образом можно реализовать этот функционал?

Как правильно организовать связь между типами записи "Работа с таксономиями" и "Компании" с использованием ACF? Я пытаюсь установить связь через родственные связи или через объект записи, выбрав тип записи "Работа", но пока не удаётся добиться нужного результата. 

Кроме того, я хочу, чтобы у пользователя в личном кабинете была возможность добавлять свою компанию и размещать вакансии. Это значит, что на странице личного кабинета должна отображаться информация о компании и список вакансий. Также на фронте, при переходе к определенной компании, должен быть доступен список вакансий этой компании.

Мне необходимо понять, как правильно выстроить эту структуру. У кого-то есть опыт в создании подобного функционала? Поделитесь, пожалуйста, советом о том, как лучше организовать логику и структуру данных. 

```php
function register_company_post_type() {
	register_post_type('company', array(
			'labels' => array(
					'name' => 'Компании',
					'singular_name' => 'Компания',
			),
			'public' => true,
			'has_archive' => true,
			'supports' => array('title', 'editor', 'thumbnail'),
			'rewrite' => array('slug' => 'companies'),
	));
}
add_action('init', 'register_company_post_type');

function register_job_post_type() {
	$labels = array(
			'name'               => 'Работа',
			'singular_name'      => 'Работа',
	);

	$args = array(
			'labels'             => $labels,
			'public'             => true,
			'has_archive'        => true,
			'rewrite'            => array('slug' => 'job'),
			'supports'           => array('title', 'editor', 'thumbnail'),
			'menu_position'      => 5,
			'menu_icon'          => 'dashicons-hammer',
			// 'register_meta_box_cb' => 'add_job_metaboxes', 
	);
```
  • 18 ноября 2024 г. 1:33
Ответы на вопрос 1
Для реализации описанного вами функционала с типами записей "Компания" и "Работа" с использованием Advanced Custom Fields (ACF) вам потребуется настроить несколько различных компонентов. Давайте подробно рассмотрим, как это можно сделать.

### 1. Регистрация пользовательских типов записей

Вы уже начали с регистрации типов записей "Компания" и "Работа". Это хорошо. Убедитесь, что у вас есть правильные возможности для работы с ними. Например:

```php
function register_company_post_type() {
    register_post_type('company', array(
        'labels' => array(
            'name' => 'Компании',
            'singular_name' => 'Компания',
        ),
        'public' => true,
        'has_archive' => true,
        'supports' => array('title', 'editor', 'thumbnail'),
        'rewrite' => array('slug' => 'companies'),
    ));
}
add_action('init', 'register_company_post_type');

function register_job_post_type() {
    register_post_type('job', array(
        'labels' => array(
            'name' => 'Работа',
            'singular_name' => 'Работа',
        ),
        'public' => true,
        'has_archive' => true,
        'supports' => array('title', 'editor', 'thumbnail'),
        'rewrite' => array('slug' => 'jobs'),
    ));
}
add_action('init', 'register_job_post_type');
```

### 2. Связь между типами записей

Для реализации связи между типами записей "Работа" и "Компания" вам понадобится использовать ACF. Вот пример того, как это можно сделать:

1. **Создание поля для связи**: В админке ACF создайте поле типа "Объект записи" или "Родственная связь" для типа записи "Работа", чтобы выбрать связанную компанию. Например, назовем его `related_company`.

2. **Добавление ACF метаполей**:

```php
if( function_exists('acf_add_local_field_group') ) {
    acf_add_local_field_group(array(
        'key' => 'group_job',
        'title' => 'Данные о вакансии',
        'fields' => array (
            array (
                'key' => 'field_related_company',
                'label' => 'Компания',
                'name' => 'related_company',
                'type' => 'post_object',
                'post_type' => array(
                    0 => 'company',
                ),
                'required' => 1,
                'return_format' => 'id',
            ),
        ),
        'location' => array (
            array (
                array (
                    'param' => 'post_type',
                    'operator' => '==',
                    'value' => 'job',
                ),
            ),
        ),
    ));
}
```

### 3. Личный кабинет пользователя

Для того чтобы пользователи могли добавлять свою компанию и размещать вакансии, вам нужно будет организовать отдельные формы на странице профиля. Вы можете использовать функции WordPress для управления созданием записей. Вот примеры:

- **Создание формы для добавления компании**:

```php
if ( isset($_POST['submit_company']) ) {
    $company_id = wp_insert_post(array(
        'post_type' => 'company',
        'post_title' => sanitize_text_field($_POST['company_name']),
        'post_content' => sanitize_textarea_field($_POST['company_description']),
        'post_status' => 'publish',
    ));
    
    // Дополнительные действия, если необходимо
}
```

- **Создание формы для добавления вакансий**:

```php
if ( isset($_POST['submit_job']) ) {
    $job_id = wp_insert_post(array(
        'post_type' => 'job',
        'post_title' => sanitize_text_field($_POST['job_title']),
        'post_content' => sanitize_textarea_field($_POST['job_description']),
        'post_status' => 'publish',
    ));
    
    // Установка связи с компанией
    if ( ! empty($_POST['related_company']) ) {
        update_field('related_company', intval($_POST['related_company']), $job_id);
    }
}
```

### 4. Отображение данных

Чтобы отображать информацию о компании и список связанных вакансий, вы можете использовать следующие функции в шаблонах.

- Для отображения информации о компании:

```php
$company_id = get_the_ID(); // Предполагается, что это страница компании
$jobs = new WP_Query(array(
    'post_type' => 'job',
    'meta_query' => array(
        array(
            'key' => 'related_company',
            'value' => $company_id,
            'compare' => '=',
       
Похожие вопросы