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, location2
Floors
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.
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.
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.
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 ..."
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.
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 .
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',
),
),
),
) );
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.