<?php
if (!class_exists('acf_form_taxonomy')) {
class acf_form_taxonomy
{
var $view = 'add';
function __construct()
{
add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts'));
add_action('create_term', array($this, 'save_term'), 10, 3);
add_action('edit_term', array($this, 'save_term'), 10, 3);
add_action('delete_term', array($this, 'delete_term'), 10, 4);
}
function validate_page()
{
global $pagenow;
if ($pagenow === 'edit-tags.php' || $pagenow === 'term.php') {
return true;
}
return false;
}
function admin_enqueue_scripts()
{
if (!$this->validate_page()) {
return;
}
$screen = get_current_screen();
$taxonomy = $screen->taxonomy;
acf_enqueue_scripts();
add_action('admin_footer', array($this, 'admin_footer'), 10, 1);
add_action("{$taxonomy}_add_form_fields", array($this, 'add_term'), 10, 1);
add_action("{$taxonomy}_edit_form", array($this, 'edit_term'), 10, 2);
}
function add_term($taxonomy)
{
$post_id = 'term_0';
$this->view = 'add';
$field_groups = acf_get_field_groups(array('taxonomy' => $taxonomy));
if (!empty($field_groups)) {
acf_form_data(array('screen' => 'taxonomy', 'post_id' => $post_id));
echo '<div id="acf-term-fields" class="acf-fields -clear">';
foreach ($field_groups as $field_group) {
$fields = acf_get_fields($field_group);
acf_render_fields($fields, $post_id, 'div', 'field');
}
echo '</div>';
}
}
function edit_term($term, $taxonomy)
{
$post_id = 'term_' . $term->term_id;
$this->view = 'edit';
$field_groups = acf_get_field_groups(array('taxonomy' => $taxonomy));
if (!empty($field_groups)) {
acf_form_data(array('screen' => 'taxonomy', 'post_id' => $post_id));
foreach ($field_groups as $field_group) {
if ($field_group['style'] == 'default') {
echo '<h2>' . $field_group['title'] . '</h2>';
}
echo '<table class="form-table">';
$fields = acf_get_fields($field_group);
acf_render_fields($fields, $post_id, 'tr', 'field');
echo '</table>';
}
}
}
function admin_footer()
{
?>
<script type="text/javascript">
(function($) {
// Define vars.
var view = '<?php
echo $this->view;
?>';
var $form = $('#' + view + 'tag');
var $submit = $('#' + view + 'tag input[type="submit"]:last');
// Add missing spinner.
if( !$submit.next('.spinner').length ) {
$submit.after('<span class="spinner"></span>');
}
<?php
if ($this->view == 'add') {
?>
// vars
var $fields = $('#acf-term-fields');
var html = '';
// Store a copy of the $fields html used later to replace after AJAX request.
// Hook into 'prepare' action to allow ACF core helpers to first modify DOM.
// Fixes issue where hidden #acf-hidden-wp-editor is initialized again.
acf.addAction('prepare', function(){
html = $fields.html();
}, 6);
// WP triggers click as primary action
$submit.on('click', function( e ){
// validate
var valid = acf.validateForm({
form: $form,
event: e,
reset: true
});
// if not valid, stop event and allow validation to continue
if( !valid ) {
e.preventDefault();
e.stopImmediatePropagation();
}
});
// listen to AJAX add-tag complete
$(document).ajaxComplete(function(event, xhr, settings) {
// bail early if is other ajax call
if( settings.data.indexOf('action=add-tag') == -1 ) {
return;
}
// bail early if response contains error
if( xhr.responseText.indexOf('wp_error') !== -1 ) {
return;
}
// action for 3rd party customization
acf.doAction('remove', $fields);
// reset HTML
$fields.html( html );
// action for 3rd party customization
acf.doAction('append', $fields);
// reset unload
acf.unload.reset();
});
<?php
}
?>
})(jQuery);
</script>
<?php
}
function save_term($term_id, $tt_id, $taxonomy)
{
$post_id = 'term_' . $term_id;
if (!acf_verify_nonce('taxonomy')) {
return $term_id;
}
acf_validate_save_post(true);
acf_save_post($post_id);
}
function delete_term($term, $tt_id, $taxonomy, $deleted_term)
{
if (acf_isset_termmeta()) {
return $term;
}
global $wpdb;
$search = $taxonomy . '_' . $term . '_%';
$_search = '_' . $search;
$search = str_replace('_', '\\_', $search);
$_search = str_replace('_', '\\_', $_search);
$result = $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s", $search, $_search));
}
}
new acf_form_taxonomy();
}