Je crée un portail client où mes clients peuvent gérer leurs projets et laisser des commentaires dans Wordpress. J'ai deux types de messages personnalisés appelés "Clients" et "Projets" et chacun tire des informations les uns des autres dans le backend. Lorsque je crée un client, il génère automatiquement son identifiant de poste dans un menu déroulant du type de post de projet où je peux affecter un client à un projet.
Ce que j'essaie d'accomplir est d'afficher tous les projets associés au client sélectionné sur une seule page du front-end. La page unique sera le portail client, qui est généré par le type de publication client.
Je n'arrive pas à afficher le post associé. Voici mon code pour single.php
qui affichera les projets sur le portail des clients.
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$loop = new WP_Query( array(
'post_type' => array( 'projects'),
'posts_per_page' => -1,
'paged' => $paged,
'meta_query' => array(
array(
'key' => 'a_client', // name of custom field
'value' => '"' . get_the_ID() . '"',
'compare' => 'LIKE'
)
)
));
?>
Vous trouverez ci-dessous le code que j'utilise pour affecter un client à un projet dans le panneau d'administration de projets. Ce script affiche tous les clients que j'ai créés dans la page client et affiche leurs noms dans un menu déroulant.
add_action( 'add_meta_boxes', 'add_clients_custom_metabox' );
function add_clients_custom_metabox() {
add_meta_box( 'custom-metabox', __( 'Clients' ), 'clients_custom_metabox', 'projects', 'side', 'high' );
}
function clients_custom_metabox($post) {
global $post,$current_user;
//remember the current $post object
$real_post = $post;
//get curent user info (we need the ID)
get_currentuserinfo();
//create nonce
echo '<input type="hidden" name="clients_meta_box_nonce" value="', wp_create_nonce(basename(__FILE__)), '" />';
//get saved meta
$selected = get_post_meta( $post->ID, 'a_clients', true );
//create a query for all of the user clients posts
$clients_query = new WP_Query();
$clients_query->query(array(
'post_type' => 'client_portal',
'posts_per_page' => -1,
'author' => $current_user->ID));
if ($clients_query->have_posts()){
echo '<select name="a_clients" id="a_clients">';
//loop over all post and add them to the select dropdown
echo '<option>Assign a client</option>';
while ($clients_query->have_posts()){
$clients_query->the_post();
echo '<option value="'.$post->ID.'" ';
if ( $post->ID == $selected){
echo 'selected="selected"';
}
echo '>'.$post->post_title .'</option>';
}
echo '<select>';
}
//reset the query and the $post to its real value
wp_reset_query();
$post = $real_post;
}
//hook to save the post meta
add_action( 'save_post', 'save_clients_custom_metabox' );
// Process the custom metabox fields
function save_clients_custom_metabox( $post_id ) {
global $post;
// verify nonce
if (!wp_verify_nonce($_POST['clients_meta_box_nonce'], basename(__FILE__))) {
return $post_id;
}
// check autosave
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return $post_id;
}
// check permissions
if ('events' == $_POST['post_type']) {
if (!current_user_can('edit_page', $post_id)) {
return $post_id;
}
} elseif (!current_user_can('edit_post', $post_id)) {
return $post_id;
}
if( $_POST ) {
$old = get_post_meta($post_id, 'a_clients', true);
$new = $_POST['a_clients'];
if ($new && $new != $old){
update_post_meta($post_id, 'a_clients', $new);
}
}
}
Code complet pour single.php http://Pastebin.com/na7djwsq
Enregistrer le type de publication que j'utilise Le type de publication de projet est appelé => projets Le type de publication de client est appelé => client_portal
Vous définissez la méta de publication comme a_clients
, mais la requête recherche a_client
.
update_post_meta($post_id, 'a_clients', $new);
'key' => 'a_client'
Ceux doivent être les mêmes. Étant donné que la mise à jour de la requête signifie que vous n'aurez plus à mettre à jour les publications, je suggère de mettre à jour la key
de la méta_query à a_clients
.