Front End Post Salvar termos filho

4

Estou tentando atualizar meu formulário de postagem final, o que me permite salvar meu termo pai de taxonomia personalizada, mas agora preciso salvar o termo filho selecionado.

NHB é para vizinhança que são termos filho para a taxonomia do tipo de cidade. Aqui está o meu código no topo para os campos relevantes -

 $city_type = wp_get_object_terms($Property_Id, 'city-type', array('fields' => 'ids'));
        $city_type = array_reverse($city_type);
        if (!empty($city_type)) {
            $city_term = get_term($city_type[0], 'city-type');
            $city_type_value = $city_term->slug;
        }
$nhb = wp_get_object_terms($Property_Id, 'city-type', array('fields' => 'ids'));
        if (!empty($nhb)) {
            $term = get_term($nhb[0], 'city-type');
            $nhb_type_value = $term->name;

E -

   wp_set_object_terms($pid, $nhb_type_value, 'city-type');

update_post_meta($pid, 'imic_property_custom_city', $property_custom_city);
                $city_for_update = get_term_by('slug', $city_type_value, 'city-type');
                $term_array = array();
                while ($city_for_update->parent != 0) {
                    $city_for_update = get_term_by('id', $city_for_update->parent, 'city-type');
                    array_push($term_array, $city_for_update->slug);
                }
                array_push($term_array, $city_type_value);
wp_set_object_terms($pid, $term_array, 'city-type');

Em seguida, minha lista suspensa para os termos filhos no meu formulário de postagem no front-end -

<?php $taxonomyName = "city-type"; 
$parent_terms = get_terms( $taxonomyName, array( 'parent' => 0, 'orderby' => 'slug', 'hide_empty' => false ) );   
echo "<select name='nhb' class='form-control' id='p-nhb'>";
echo "<option class='button' value='Any'>All</option>";
foreach ( $parent_terms as $pterm ) {
    //Get the Child terms
    $terms = get_terms( $taxonomyName, array( 'parent' => $pterm->term_id, 'orderby' => 'slug', 'hide_empty' => false ) );
    foreach ( $terms as $term ) {
$selected = ($nhb_type_value == $term->name) ? "selected" : "";
        echo "<option data-val='" . $pterm->slug . "' value='" . $term->slug . "' ' . $selected . '>" . $term->name . "</option>"; 
    }
}
echo "</select>"; 
?>

Como posso obter isso para salvar como um termo filho e também como resultado? Eu atualmente produzo o termo pai assim -

<?php  $terms = wp_get_post_terms(get_the_ID(), 'city-type');
  if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
     foreach ( $terms as $term ) {
       echo '' . $term->name . '';      
     }
  } ?>

UPDATE

Na parte superior da minha página, tenho o seguinte para salvar os termos. $ city_type é para os termos pai da taxonomia "tipo cidade". $ nhb é para os termos filhos que correspondem ao termo pai selecionado / salvo.

<?php
/*
  Template Name: Front End Form
 */
get_header();
global $current_user, // Use global
get_currentuserinfo(); // Make sure global is set, if not set it.
$subdraft = $_POST['subdraft'];
$edit_url = imic_get_template_url('template-edit-property-new.php');
if ((user_can($current_user, "administrator"))||(user_can($current_user, "edit_others_posts")) ):
    global $imic_options;
    $msg = '';
    $flag = 0;
    $Property_Id = $property_title = $city_type_value = $nhb_type_value = '';

    if (get_query_var('site')) {
$Property_Id = get_query_var('site');
$property_title = get_the_title($Property_Id);
        $city_type = wp_get_object_terms($Property_Id, 'city-type', array('fields' => 'ids'));
        $city_type = array_reverse($city_type);
        if (!empty($city_type)) {
            $city_term = get_term($city_type[0], 'city-type');
            $city_type_value = $city_term->slug;
        }
$nhb = wp_get_object_terms($Property_Id, 'city-type', array('fields' => 'ids'));
        if (!empty($nhb)) {
            $term = get_term($nhb[0], 'city-type');
            $nhb_type_value = $term->name;
        }


    }
    $Property_Status = get_post_meta(get_the_ID(), 'imic_property_status', true);

// Check if the form was submitted
    if ('POST' == $_SERVER['REQUEST_METHOD'] && !empty($_POST['action'])) {

$property_title = $_POST['title'];

$nhb_type_value = $_POST['nhb'];


if (isset($_POST['textonomies_city']) && !empty($_POST['textonomies_city'])) {
            $reverce_data = array_reverse($_POST['textonomies_city']);
            foreach ($reverce_data as $textonomies_city) {
                if (!empty($textonomies_city)) {
                    $city_type_value = $textonomies_city;
                    break;
                }
            }
            $property_custom_city = '';
        }

        if (($city_type_value == 'other') || ($city_type_value == 'city')) {
            $city_type_value = '';
        }
             if ($msg == '') {
            if (get_query_var('site')) {
                $post = array(
                    'ID' => get_query_var('site'),
                    'post_title' => $property_title,
                    'post_content' => $property_content,
                    'post_date' => $property_listdate_value,
                    'post_status' => 'publish', // Choose: publish, preview, future, etc.
                    'post_type' => 'property'  // Use a custom post type if you want to
                );
                $pid = wp_update_post($post);
                // Pass  the value of $post to WordPress the insert function
                $flag = 1; 
            } else {
                    $post_status = 'draft';
                }
                $post = array(
                    'post_title' => $property_title,
                    'post_content' => $property_content,
                    'post_status' => $post_status,
                    'post_date' => $property_listdate_value,
                    'post_type' => 'property'  // Use a custom post type if you want to
                );
                $pid = wp_insert_post($post);
                $total_property = get_user_meta($current_user->ID, 'property_value', true);
                $new_value = ($total_property != 0) ? ($total_property - 1) : $total_property;
                update_user_meta($current_user->ID, 'property_value', $new_value);
                $flag = 1;
            }

                wp_set_object_terms($pid, $nhb_type_value, 'city-type');


            if ('POST' == $_SERVER['REQUEST_METHOD']) {

// Set Terms For Tax
wp_set_object_terms($pid, $nhb_type_value, 'city-type');

                $city_for_update = get_term_by('slug', $city_type_value, 'city-type');
                $term_array = array();
                while ($city_for_update->parent != 0) {
                    $city_for_update = get_term_by('id', $city_for_update->parent, 'city-type');
                    array_push($term_array, $city_for_update->slug);
                }
                array_push($term_array, $city_type_value);
wp_set_object_terms($pid, $term_array, 'city-type');


if (get_query_var('site')) {
$Property_Id = get_query_var('site');
$property_title = get_the_title($Property_Id);

$nhb = wp_get_object_terms($Property_Id, 'city-type', array('fields' => 'ids'));
                if (!empty($nhb)) {
                    $terms = get_term($nhb[0], 'city-type');
                    $nhb_type_value = $terms->name;
                }


            }
        }
}
if(get_query_var('remove')){
    $delete_id = get_query_var('remove');
    $post_author = get_post_field('post_author',$delete_id);
$user_name= $current_user->ID;
if($post_author==$user_name){
    wp_trash_post($delete_id); }
}
    if (get_query_var('site')) {
        $current_Id = get_query_var('site');
    } else {
        $current_Id = get_the_ID();
    }

  ?>  

O formulário -

 <form action="" method="post" enctype="multipart/form-data">

A lista suspensa de termos filho é selecionada -

<?php $taxonomyName = "city-type"; 
$parent_terms = get_terms( $taxonomyName, array( 'parent' => 0, 'orderby' => 'slug', 'hide_empty' => false ) );   
echo "<select name='nhb' class='form-control' id='p-nhb'>";
echo "<option class='button' value='Any'>All</option>";
foreach ( $parent_terms as $pterm ) {
    //Get the Child terms
    $terms = get_terms( $taxonomyName, array( 'parent' => $pterm->term_id, 'orderby' => 'slug', 'hide_empty' => false ) );
    foreach ( $terms as $term ) {
$selected = ($nhb_type_value == $term->name) ? "selected" : "";
        echo "<option data-val='" . $pterm->slug . "' value='" . $term->slug . "' " . $selected . ">" . $term->name . "</option>"; 
    }
}
echo "</select>"; 
?>
    
por Rich 18.10.2017 / 21:06

2 respostas

1

Ok, descobri usando a sugestão @TomMorton.

Eu tive que atualizar meu código para isso, o que atualiza os termos -

$city_for_update = get_term_by('slug', $city_type_value, 'city-type');
$term_array = array();
while ($city_for_update->parent != 0) {
    $city_for_update = get_term_by('id', $city_for_update->parent, 'city-type');
    array_push($term_array, $city_for_update->slug);
}
array_push($term_array, $city_type_value);

$child_term = get_term_by('slug', $nhb_type_value, 'city-type');
$term_array = array();
/*Find child ID the user selected*/
while ($child_term->parent != 0) {
    $child_term = get_term_by('id', $child_term->ID, 'city-type');
    //Get child term object and add to term_array
    array_push($term_array, $child_term->slug);
}
array_push($term_array, $nhb_type_value);

E isso para configurá-los -

$nhb_type_value = $_POST['nhb'];

$nhb_type = wp_get_object_terms($Property_Id, 'city-type', array('fields' => 'ids'));
$nhb_type = array_reverse($nhb_type);
                if (!empty($nhb_type)) {
                    $terms = get_term($nhb_type[0], 'city-type');
                    $nhb_type_value = $terms->slug;
                }

A única coisa que eu tive que mudar na minha lista suspensa foi isso, eu estava usando o nome do termo, mas eu mudei para slug prazo -

$selected = ($nhb_type_value == $term->slug) ? "selected" : "";

Depois, certifique-se de que os termos estão sendo definidos usando -

wp_set_object_terms($pid, $nhb_type_value, 'city-type');
    
por Rich 13.11.2017 / 22:45
2

Ao salvar termos filhos, acredito que você possa adicioná-los ao grupo $term_array , onde os pais estão. Do ponto de vista de uma postagem (ou do tipo de postagem personalizada), salvar a taxonomia não tem nada a ver com pai ou filho.

Os estados do WP Codex "Para termos hierárquicos (como categorias), você deve sempre passar o id em vez do nome do termo para evitar confusão onde possa haver outro filho com o mesmo nome." Isso implica que você deve ser capaz de passar o ID da criança e ele será categorizado no termo filho.

Fonte: enlace

Em relação à exibição dos filhos, você pode fazer isso de duas maneiras. O primeiro, você pode continuar percorrendo os filhos com base no seu código:

/*
Display child terms:

Source:
https://developer.wordpress.org/reference/functions/get_term_children/
*/
$parent_terms = wp_get_post_terms(get_the_ID(), 'city-type');
if ( ! empty( $parent_terms ) && ! is_wp_error( $parent_terms ) ){
    foreach ( $parent_terms as $parent ) {
        echo '' . $parent->name . '';

        $children = get_term_children($parent->ID, 'city-type'); //term_id, taxonomy
        if(!empty($children) && ! is_wp_error( $children )){
            foreach($children as $child){
                echo '' . $child->name . '';
            }
        }
    }
}

Ou você pode percorrer os filhos depois de obtê-los dos pais (no caso de você ter um pai, mas precisar de filhos:

/* OR YOU CAN GET CHILDREN DIRECTLY */
$children = get_terms(array(
    'parent' => 10 //ID_OF_PARENT_YOU_WANT
));

if(!empty($children) && ! is_wp_error( $children )){
    foreach($children as $child){
        echo '' . $child->name . '';
    }
}

EDIT: Mostrando um exemplo de função de salvamento.

wp_set_object_terms($pid, $nhb_type_value, 'city-type');

update_post_meta($pid, 'imic_property_custom_city', $property_custom_city);
$city_for_update = get_term_by('slug', $city_type_value, 'city-type');
$term_array = array();
while ($city_for_update->parent != 0) {
    $city_for_update = get_term_by('id', $city_for_update->parent, 'city-type');
    array_push($term_array, $city_for_update->slug);
}
array_push($term_array, $city_type_value);

/*Find child ID the user selected*/
while ($child_term->parent != 0) {
    $child_term = get_term_by('id', $child_term->ID, 'city-type');
    //Get child term object and add to term_array
    array_push($term_array, $child_term->slug);
}

wp_set_object_terms($pid, $term_array, 'city-type');
    
por Tom 25.10.2017 / 19:08