Zeigen Sie eine Abfrage mit mehreren Beitragstypen und derselben Beziehung auf einer einzelnen Seite an


8

Ich erstelle ein Kundenportal, in dem meine Kunden ihre Projekte pflegen und Feedback in Wordpress hinterlassen können. Ich habe zwei benutzerdefinierte Beitragstypen mit den Namen "Clients" und "Projekte", die im Backend jeweils Informationen voneinander abrufen. Wenn ich einen Client erstelle, generiert er automatisch seine Post-ID in einem Dropdown-Menü des Post-Typs des Projekts, in dem ich einem Projekt einen Client zuweisen kann.

Ich versuche, alle Projekte, die dem ausgewählten Client zugeordnet sind, auf einer einzigen Seite im Frontend anzuzeigen. Die einzelne Seite ist das Kundenportal, das vom Kundenposttyp generiert wird.

Ich kann den zugehörigen Beitrag nicht anzeigen. Hier ist mein Code, für single.phpden die Projekte auf dem Kundenportal angezeigt werden.

 <?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'
             )
          )                 
     )); 
 ?> 

Unten ist der Code, den ich verwende, um einem Projekt im Admin-Bereich von Projekten einen Client zuzuweisen. Dieses Skript zeigt alle Clients an, die ich auf der Client-Seite erstellt habe, und zeigt deren Namen in einem Dropdown-Menü an.

 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);
}
 }
  }

Vollständiger Code für single.php http://pastebin.com/na7djwsq

Post-Typ registrieren Ich verwende den Projekt-Post-Typ heißt => Projekte Der Client-Post-Typ heißt => client_portal


warum ist pagedeingestellt auf $client_ID? Sie können auch posts_per_pagealle Beiträge zurückgeben.
Milo

Ursprünglich hatte ich $ client_ID als $ paged, aber in keinem Szenario, das ich tat, schien etwas angezeigt zu werden. @ Milo
bigant841

Ursprünglich eine Frage zum
Stapelüberlauf

Es sieht so aus, wie es clientsein sollte a_clientund @ bigant841 speichert das Meta als Array, also sieht es so aus:[a_clients] => Array ([0] => 91)
Howdy_McGee

Das Benennen eines Beitragstyps im Plural ist ungewöhnlich. Sind Sie sicher, dass die richtige Schnecke ist projects? Nicht project?
Tao

Antworten:


1

Sie legen das Post-Meta als fest a_clients, aber die Abfrage sucht nach a_client.

update_post_meta($post_id, 'a_clients', $new);

'key' => 'a_client'

Diese müssen gleich sein. Da das Aktualisieren der Abfrage bedeutet, dass Sie die Beiträge nicht erneut aktualisieren müssen, empfehle ich, die keyder meta_query auf zu aktualisieren a_clients.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.