web-dev-qa-db-fra.com

Types de publication personnalisés hiérarchiques dans un tableau

J'ai trois types d'articles 'location' personnalisés qui constituent une hiérarchie de zones:

location1, location2, location3.

location1 est le niveau supérieur, puis location2 et location3 sont enfants l'un de l'autre. Par exemple, location1 pourrait être Bâtiments, location2Floors et location3 Pièces.

location2 et location3 ont des métaboxes avec les champs loc2_parent_location et loc3_parent_location respectivement. Je cherche à faire un tableau qui serait peuplé à partir de types de publication personnalisés pour afficher comme:

Référence du type de poste:

location1 > location2 > location3

Echo en tant que:

Building 1
Building 1 > Floor 1
Building 1 > Floor 1 > Room A
Building 1 > Floor 1 > Room B
Building 1 > Floor 2
Building 1 > Floor 3
Building 2

Voici la fonction sur laquelle je travaille:

function location_types_query ( $query ) {
// get custom post types
$args = array( 'post_type' => 'location1' );
$args = array( 'post_type' => 'location2' );
$args = array( 'post_type' => 'location3' );

// create hierachy relationships
if ($location2) {
    $parent_location = get_post_meta( $post->ID, 'loc2_parent_location', true );
} elseif ($location3) {
    $parent_location = get_post_meta( $post->ID, 'loc3_parent_location', true );
} elseif ($location1) {
    $parent_location = '';
}

// Run the query
$the_query = new WP_Query( $args );

// The Loop
if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) : $the_query->the_post();
  foreach ($location as $locations)

    if (isset($location1)) {
        echo $location1;
    }

    if (isset($location1 && $location2)) {
        echo $location1 . '>' . $location2; 
    }

    if (isset($location1 && $location2  && $location3)) {
        echo $location1 . '>' . $location2 . '>' . $location3; 
    }

    return array($locations);  // output array

endwhile;
endif;

// Reset Post Data
wp_reset_postdata();

}
?>

Que dois-je faire pour que cette fonction fonctionne correctement et crache un tableau des champs.

/ -------------------------------------------- --------------- /
/* Edit 10/23 - Informations complémentaires
/ ----------------------------------- -------------------- /

@ Kaiser - Le meilleur moyen de résoudre ce problème est de créer un site Web de gestion immobilière. J'ai les types de post comme énumérés ci-dessus. Tout est dynamique à partir des options afin qu'un utilisateur puisse configurer le système comme ci-dessus:

Bâtiment 1 Bâtiment 1> Étage 1 Bâtiment 1> Étage 1> Salle A

Où "bâtiment 1" est un poste dans l'emplacement 1 du cpt, "étage 1" est un poste dans l'emplacement 2 du cpt et "Salle A" est un poste dans l'emplacement 3 du cpt.

OU il peut être configuré comme

(location1)> (location2)> (location3) // Types de poste Bâtiment 1> Étage 1> Appartement A // Poste Bâtiment 1> Étage 1> Appartement B

De plus, chaque type de publication a une metabox qui a des valeurs pour les détails de la localisation.
Pour ..

Lieu 1: - Plan de situation - Personne responsable

Emplacement 2: - Plan d’emplacement - Personne responsable - Emplacement du parent

Emplacement 3: - Plan d’emplacement - Personne responsable - Emplacement du parent

J'ai déjà configuré la base de données de localisation complète pour mon site immobilier. Ce que je veux maintenant faire, c'est ajouter un formulaire de maintenance sur l'interface de WP dans une zone membre sécurisée afin que le locataire puisse soumettre une demande de maintenance. J'ai décidé d'utiliser des formes de gravité avec un champ de sélection multiple. Je dois remplir un tableau comme ci-dessus pour afficher les différents emplacements dans les différents bâtiments, afin que l'utilisateur puisse le sélectionner, puis remplir le champ comme ci-dessous à l'aide du tableau de type publication que j'ai créé pour les emplacements:

/*-------------------------------------------------------*/
/* Location
/*-------------------------------------------------------*/
add_filter("gform_pre_render", "gform_prepopluate_populate_location");
add_filter("gform_admin_pre_render", "gform_prepopluate_populate_location");

function gform_prepopluate_populate_location($form){
    $querytype = array('location1', 'location2', 'location3')
    $formid = 5;
    $fieldid = 7;

    if($form["id"] != $formid)
        return $form;

    $posts = query_posts( array( 'post_type' => $querytype ) );
    $items = array(); /* Add Blank */
    $items[] = array("text" => "", "value" => "");

    foreach($posts as $post)
        $items[] = array("value" => $post->ID, "text" => $post->post_title);

    foreach($form["fields"] as &$field)
        if($field["id"] == $fieldid ){            
            $field["choices"] = $items;
        }
    return $form;

}

Je peux ensuite renvoyer les résultats du formulaire sous forme de type de message personnalisé, dire "demandes de maintenance" et demander à la personne effectuant le travail (responsable) d'afficher la demande sur leur tablette et de cliquer sur l'emplacement qui ouvre le plan.

1
Rizzo

Il semble que vous cherchiez à réaliser une simple relation parent/enfant avec * n niveaux. J'ai rencontré quelque chose de similaire lorsque je travaillais sur des publications subordonnées https://github.com/codearachnid/wp-subordinate-post . La façon dont j'ai résolu la hiérarchie (et même permis un permalink profond) consistait à utiliser le champ post_parent . D'après vos déclarations, il semble y avoir plusieurs associations supplémentaires, telles que l'accrochage d'un ( maintenance/vente) personne à un étage qui couvrirait plusieurs pièces, etc. Cependant, pour répondre à votre problème principal, il semble que si vous abordez la hiérarchie qui résoudra les relations dans la liste?

Ainsi, pour cracher le tableau ordonné, je vous recommande de configurer une requête en boucle pour les enfants par parent.

0
codearachnid

Le faire différemment

Votre problème est principalement un "problème XY" . Vous pourriez rendre la vie beaucoup plus facile en ayant simplement trois types de publication, une pour chaque bâtiment ou une seule nommée "Chambres". Puis assignez-leur les différents emplacements (Bâtiment/Étage). Vous pouvez ajouter des descriptions aux termes et les afficher au bon endroit. Beaucoup plus facile et beaucoup plus "autochtone", car les éléments partagés comme le même bâtiment ou le même étage devraient être des termes de taxonomie. En les rendant hiérarchiques, vous pouvez convoquer des salles sous eux.

En d'autres termes, vos "pièces" se voient attribuer un "étage" et un "bâtiment". Ou encore mieux (si vous voulez avoir la possibilité d’attribuer des plans d’étage ou toute autre information supplémentaire propre à un étage, vous devez alors affecter un seul étage avec un terme parent avec le nom du nom du bâtiment correspondant comme terme.

  • Bâtiment A>
    • Étage 1a
    • Étage 2A
    • Étage 3A
  • Bâtiment B>
    • Étage 1B
    • Étage 2B
    • Étage 3B

Et les chambres sont par exemple

Type de message personnalisé "Chambres"> Nom de la chambre: "Salle de congrès Philip K. Dick" | Étage 2B

et le terme parent "Bâtiment B" peut simplement être appelé dans le contexte (il est déjà connecté au terme.

L'avantage est que vous pouvez facilement ajouter des éléments tels que: "Recherchez-vous ..."

  • "Autres pièces au même étage"
  • "Autres pièces dans le même bâtiment"
  • etc.

ce qui facilitera la correction des erreurs si quelqu'un se trouve au bon étage mais dans le mauvais bâtiment, etc. Des possibilités infinies.

Enregistrer correctement

Jetons d'abord un coup d'oeil à register_taxonomy() et à ses arguments. Vous remarquerez que vous pouvez ajouter une taxonomie hierarchical car la taxonomie "catégorie" intégrée est:

register_taxonomy( 'rooms', 
    array(
        'location1',
        'location2',
        'location3',
    ),
    array(
        'hierarchical' => 'true',
        // other arguments
        'rewrite'      => array(
            'slug'         => 'floor',
            'with_front'   => true,
            'hierarchical' => true,
        ),
        'labels'       => array(
            'name'          => __( 'Rooms', 'your_textdomain' ),
            'singular_name' => __( 'Room', 'your_textdomain' ),
            'parent_item'   => __( 'Floor', 'your_textdomain' ),
        ),
    )

);

Important: Assurez-vous d'enregistrer les taxonomies et les types de publication l'un à l'autre dès que vous les enregistrez. Assurez-vous de le faire assez tôt, sur init avec une priorité de 0. Plus d'informations à ce sujet ici .

Faire le tax_query

Ensuite, regardez WP_Query paramètres.

Vous pouvez simplement interroger par plusieurs types de messages:

$locations = new WP_Query( array(
    'post_type' => array(
        'location1',
        'location2',
        'location3',
    ),
    'tax_query' => array(
        'realation' => 'OR',
        array( 
            'taxonomy' => 'rooms',
            'field'    => 'slug',
            'terms'    => array(
                'roomA',
                'roomB',
            ),
        ),
    ),
) );

La boucle et terme ancêtres

Ensuite, vous pouvez parcourir votre nouvelle boucle $location. Chaque fois que vous appelez un message, vous pouvez simplement get_ancestors( $termID, $taxonomyName ) obtenir tous les ancêtres (Bâtiment/Plancher) de cet emplacement.

1
kaiser