Форма интерфейса ACF для создания термина
Я хочу использовать функцию формы внешнего интерфейса ACF для создания формы с настраиваемыми полями, которая используется для создания термина таксономии, в данном случае группы. Я видел, как реализовать это с помощью поста, и делал это по всему сайту, но я не могу реализовать это, чтобы вставить новый термин. Я думаю, что я на правильном пути, но все еще у меня проблемы с этим, не добавляя термины
function my_pre_save_post( $post_id )
{
// check if this is to be a new post
if( $post_id != 'new' )
{
return $post_id;
}
// Create a new group
// insert the group
$post_id = wp_insert_term(
$_POST['acf[_post_title]'], // the term
'groups', // the taxonomy
array(
'description'=> $_POST['acf[_post_content]'],
)
);
// update $_POST['return']
$_POST['return'] = add_query_arg( array('post_id' => $post_id), $_POST['return'] );
// return the new ID
return $post_id;
}
add_filter('acf/pre_save_post' , 'my_pre_save_post' );
$args = array(
'post_id' => 'new',
'field_groups' => array( 6055 ),
'post_title' => true,
'post_content' => true,
);
acf_form($args);
1 ответ
Может быть, уже слишком поздно, но я хочу ответить, чтобы помочь другим, у кого есть эта проблема. В WP Codex мы можем найти хорошее решение, основанное на поведении ядра wp.
Прежде всего, мы должны создать группу полей ACF и настроить ее отображение на экране редактирования таксономии. Затем добавьте пользовательские объявления к нему. Необходимо создать хотя бы одно настраиваемое поле - для будущего названия термина оно должно быть обязательным. Любые другие поля на ваше усмотрение.
Перед рендерингом формы нужно проверить одну вещь. Нам нужно знать идентификатор группы полей ACF. Вы можете найти его в URL на странице редактирования группы, например:
http://site.ru/wp-admin/post.php?post=340&action=edit
В этом случае идентификатор группы составляет 340. Если вы не хотите использовать жестко закодированный идентификатор (если ваши группы меняются время от времени), вы можете получить его, используя имя группы (в этом примере идентификатор группы id Technic CPT):
global $wpdb;
$group_ID = $wpdb->get_var( "SELECT ID FROM $wpdb->posts WHERE post_title = 'Technic CPT'" );
Итак, теперь мы готовы сделать нашу форму:
acf_form_head();
$acf_form_args = array(
'id' => 'technic_add_form',
'post_id' => 'new_post',
'form' => true,
'submit_value' => 'Publish',
'field_groups' => array($group_ID),
'new_post' => array(
'post_type' => 'technic',
'post_status' => 'publish'
)
);
acf_form( $acf_form_args );
Обратите внимание на параметр "post_type"! Это должно быть название (слаг) вашей таксономии. В этом примере я создаю термины для таксономии "техника".
Теперь мы должны запретить сохранение этих данных как пост и вместо этого создать термин. Новые сообщения создаются функцией wp_post_insert(), содержащей много полезных фильтров и действий. Одним из них является очень полезный фильтр - 'wp_insert_post_data'. Он срабатывает после создания массива данных поста, но перед вставкой в базу данных. Только то, что нам нужно, верно?
add_filter( 'wp_insert_post_data', 'acf_taxonomy_handler', '99', 2 );
function acf_taxonomy_handler( $data, $postarr ) {
if ( $data[ 'post_type' ] == 'technic' ) :
global $wpdb;
$group_ID = $wpdb->get_var( "SELECT ID FROM $wpdb->posts WHERE post_title = 'Technic CPT'" );
$acf_fields = acf_get_fields_by_id( $group_ID );
foreach ( $acf_fields as $acf_field ) $$acf_field[ 'name' ] = trim( esc_attr( strip_tags( $_POST[ 'acf' ][ $acf_field[ 'key' ] ] ) ) );
$term = wp_insert_term( $technic_name, 'technic' );
if ( $term ) :
foreach ( $acf_fields as $acf_field ) :
update_field( $acf_field[ 'name' ], ${$acf_field[ 'name' ]}, 'technic_' . $term[ 'term_id' ] );
endforeach;
endif;
return;
else :
return $data;
endif;
}
Теперь давайте объясним эту функцию.
Прежде всего мы проверяем post_type, чтобы найти название нашей таксономии.
Затем мы получаем массив настраиваемых полей из нашей связанной группы полей acf и очищаем их значения.
Следующим шагом является создание нового термина. Мы используем одно из наших пользовательских полей в качестве имени нового термина.
Затем, если все в порядке, мы можем обновить все значения настраиваемых полей и прекратить выполнение wp_insert_post().
И если мы получим какой-то другой post_type, мы просто вернем $data.
Итак, термин создан:) Если вы хотите не только добавлять термины во внешний интерфейс, но также редактировать и сохранять их, вы должны написать еще одну функцию для другого фильтра 'acf / pre_save_post'. Код практически такой же, но если вам нужно, я могу опубликовать его.