web-dev-qa-db-fra.com

Ajout automatique de métadonnées à des publications ou à l'aide de plusieurs requêtes

J'exécute une société d'événements dont le site Web utilise un système de type de publication personnalisé pour les publications (blog), les événements et les tickets stockés sous forme de CPT dans la base de données.

Sur la liste des invités (qui compte les billets personnalisés "ticket" si l'événement [message] numéro == message actuel), j'aimerais implémenter une balise "Nouveau client" pour inviter l'hôte à les rechercher.

Il y a deux problèmes avec cela: vous ne pouvez pas rechercher le billet de billet le plus ancien, car ils ne l'ont peut-être pas acheté dans l'ordre chronologique, et vous ne pouvez pas obtenir tous les billets ni les commandes par numéro car ils n'ont peut-être pas été ajoutés au site. dans l'ordre chronologique non plus.

Les deux manières dont je peux penser à résoudre ce problème sont les suivantes:

(1) Par plusieurs tableaux de recherche, c.-à-d. Interroger TICKET> pour obtenir UTILISATEUR> obtenir tous les TICKETS pour NUMÉRO D'UTILISATEUR> obtenir NOMBRE D'ÉVÉNEMENTS [POST] à partir de ces tickets (stockés en tant que méta)> obtenir ÉVÉNEMENTS par numéro postal> - RÉSEAU DE TRI PAR DATE DE event> SI PREMIER ÉVÉNEMENT DANS CET ARRAY == ÉVÉNEMENT ACTUEL [post] NUMBER echo NOUVEAU CLIENT
Cela semble être un très long chemin et je suis un peu réticent à essayer de faire fonctionner tout cela en tant que codeur relativement novice.

(2) D'une manière ou d'une autre, ajouter de manière rétrospective une balise de métadonnées "date d'événement" à toutes les publications de ticket et ensuite, je peux directement les interroger .... C'est beaucoup plus facile, mais je ne sais pas comment re-traduire ensuite 010214 afin que la requête reconnaisse comme une date plutôt qu'un chiffre ...

Le nombre (2) serait idéal, mais je ne trouve aucune information sur la manière d’ajouter toutes ces données de manière rétrospective, puis pour de futures publications - toutes les données sont présentes dans le système, mais toutes les recherches d’informations me mènent à des personnes qui en parlent. revenir en arrière et ajouter en lots le méta du moteur de recherche, pas le méta post-WordPress.

J'ai commencé à coder Number (1) et à me rendre compte de la montagne devant moi et à m'arrêter - si quelqu'un veut cette partie du code, je peux quand même la poster ...

Merci d'avance, désolé pour la longue question - essayer d'équiper les assistants avec autant d'informations que possible.

EDIT: Une solution consiste à utiliser la page de l’événement elle-même puisque chaque $event et $ticket sont appelés à cet endroit.

La structure pourrait être:

write meta to `$ticket`
with
meta key = 'event_date'
value = $eventDay [= date( 'dmy', $event->start );]

Ensuite, une simple requête pour trouver tous les tickets utilisateur, et commander par cette nouvelle balise Méta "date_événement".

Si premier numéro d’événement d’entrée == poste actuel, BINGO!

2
Bysander

Alors,

J'ai contourné cela en mettant en fait la fonction pour ajouter les métadonnées sur les pages de l'événement elles-mêmes (dans event-single.php). Cela signifie que vous n'êtes pas tenu en fonction de la date de l'événement au moment de la création du ticket, par exemple si vous modifiez la date de l'événement. Chaque fois que la page est consultée, la date est transférée aux tickets en question.

J'ai stocké les métadonnées de date au format yymmdd. En fait, si vous les commandez par ordre numérique, vous obtiendrez le résultat correct sans avoir à les traduire à nouveau.

(Cela peut ne pas être parfait - je suis un codeur débutant et je me suis enseigné php à travers la nécessité de maintenir un site web wordpress)

Donc c'est ce que j'ai fait.

    ## PUT EVENT DATE DETAILS ONTO TICKET POST & WORK OUT **NEW CUSTOMERS** ##
$eventDay = date( 'ymd', $event->start );
$tixID = $ticket['id'];
$eventKey = event_date;
update_post_meta($tixID , $eventKey , $eventDay ); #This has added the event date ($eventDay) to the Ticket Meta

    //    Now we have to search to see which event is the first
$useremail = $ticket['email'];
$user = get_user_by( 'email', $useremail );
$IDuser = $user->ID;
$args = array(
              'posts_per_page' => 1,
              'post_type' => 'ticket',
              'author' => $IDuser,
              'meta_key' => 'state',
              'meta_value' => 'complete',
              'orderby' => 'event_date',
              'order' => 'ASC',
              );
$first_post = new WP_Query($args);
//    '<pre>'.print_r($first_post).'</pre>'; /* Use this to test the array produced */
if ($first_post->have_posts()) {
    $first_post->the_post();

    $firstID = get_the_ID(); // This gets the post number of the first 'ticket' post
    $firsteventdate = get_post_meta( $firstID, 'event_date', true); //This uses that number to extract the date of the first event.


    wp_reset_postdata();
}
    if ($firsteventdate == $eventDay) { ?> <b>**NEW CUSTOMER**</b> <?php } else { ?> Old
    <?php }
        ?>
1
Bysander

Cela interrogera toutes les publications de tickets et mettra à jour un champ _ticket_date. Cependant, je ne sais pas encore comment récupérer la date réelle, vous devrez donc me fournir un peu plus d'informations à ce sujet. En supposant que cela fonctionne correctement, je lancerais le programme suivant une fois, puis le supprimerais. Vous pouvez obtenir un effet similaire en définissant un paramètre transitoire, mais je ne vais pas entrer dans les détails maintenant.

function update_ticket_meta(){

  $args = array( 'post_type' => 'ticket', 'nopagination' => true );
  $tickets = new WP_Query( $args );

  if ( $tickets->have_posts() ) while( $tickets->have_posts() ){
    $tickets->the_post();

    // get the event ID- adjust meta key as needed
    $event_id = get_post_meta( $post->ID, '_event', true );

    // get the date from the event post
    $event = Ai1ec_Events_Helper::get_event($event_id);

    if( $event ) {
       // get date in desired format- YYYYMMDD should be the easiest to query by
       $date = date( 'ymd', $event->start );

       if( $date )
        update_post_meta( $post->ID, '_ticket_date', $date );
    }

  }
}
add_action( 'admin_init', 'update_ticket_meta' );

En outre, pour enregistrer la méta chaque fois qu'un ticket est enregistré, vous pouvez ajouter une action à save_post-{post-type}. Cela vous laissera encore un peu de code à faire si vous modifiez le champ méta de date de l'événement.

// save some meta when a ticket is saved
function add_ticket_date( $post_id ){

    if( !class_exists( 'Ai1ec_Events_Helper' ) )
          return;

    // get the event ID- adjust meta key as needed
    $event_id = isset( $_POST['_event'] ) ? (int) $_POST['_event'] : -1;

    // get the date from the event post- again adjust meta key
    $event = Ai1ec_Events_Helper::get_event($post->ID);

    // get date in desired format- YYYYMMDD should be the easiest to query by
    $date = date( 'ymd', $event->start );

    if( $date )
        update_post_meta( $post_id, '_ticket_date', $date );


}
add_action( 'save_post-ticket', 'add_ticket_date' );
2
helgatheviking