Last active
August 5, 2022 14:26
-
-
Save iandunn/5ccc8f8a01ccb1a981c3 to your computer and use it in GitHub Desktop.
CampTix Attendee Badges with Gravatars
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
* Generate a CSV for InDesign with attendee info and Gravatars | |
* | |
* See http://plan.wordcamp.org/helpful-documents-and-templates/create-wordcamp-badges-with-gravatars/ for instructions | |
* | |
* input is a CSV export of CampTix attendees. Format is: "First Name","Last Name","E-mail Address","Twitter Username" | |
* the script downloads the attendee's Gravatars, and adds a column to the CSV with the filename of the image | |
* the CSV can then be used by InDesign to generate wordcamp badges with the attendee's gravatar | |
* | |
* make sure you update the input/output file paths before running | |
*/ | |
$_SERVER['HTTP_HOST'] = 'example.org'; | |
define( 'ABSPATH', '/path/to/example.org/' ); | |
require dirname( dirname( __FILE__ ) ) . '/wp-config.php'; | |
// Configuration | |
$gravatar_dir = __DIR__ . '/output/camptix-gravatar-badges/'; | |
$original_csv = fopen( $gravatar_dir . 'badges-input.csv', 'r' ); // @todo accept filenames from cli argument | |
$final_csv = fopen( $gravatar_dir . 'badges-output.csv', 'w' ); | |
$destination_directory = 'Macintosh HD:Users:ian:Desktop:wcus-badges:'; // @todo accept from cli argument | |
$replace_empty_twitter = false; | |
$missing_gravatars = array(); | |
$output_headers = array( 'First Name', 'Last Name', 'Twitter', '@Gravatar' ); // The Gravatar column is prefixed with a @ to let InDesign know that it contains images | |
echo "\nRunning..."; | |
if ( $original_csv && $final_csv ) { | |
$row = -1; | |
$gravatar_file = null; | |
fputcsv( $final_csv, $output_headers ); | |
while ( ( $attendee = fgetcsv( $original_csv, 1000, "," ) ) !== FALSE ) { | |
$row++; | |
if ( $row == 0 ) { | |
continue; // skip header | |
} | |
foreach ( $attendee as $key => $value ) { | |
$attendee[ $key ] = trim( $value ); | |
} | |
// Create empty badges for unknown attendees | |
if ( 'unknown.attendee@example.org' == $attendee[2] ) { | |
$attendee[0] = $attendee[1] = $attendee[2] = $attendee[3] = ''; | |
} | |
// Capitalize the first and last names so they look better | |
// todo if there's more than one word in either field, don't do anything b/c could be something like "Ines van Essen" and they want the "van" lowercase | |
$attendee[0] = ucwords( $attendee[0] ); | |
$attendee[1] = ucwords( $attendee[1] ); | |
// Download the Gravatar | |
$filename = 'default.png'; | |
if ( $attendee[2] ) { | |
$gravatar_source = wp_remote_get( 'http://www.gravatar.com/avatar/' . md5( strtolower( trim( $attendee[2] ) ) ) . '.jpg?s=512&default=404' ); | |
if ( ! is_wp_error( $gravatar_source ) && 200 == $gravatar_source['response']['code'] ) { | |
$filename = strtolower( remove_accents( $attendee[0] . '-' . $attendee[1] ) ); | |
$filename = sanitize_file_name( $row . '-' . $filename . '.jpg' ); | |
$gravatar_file = fopen( $gravatar_dir . '/' . $filename, 'w' ); | |
fwrite( $gravatar_file, $gravatar_source['body'] ); | |
fclose( $gravatar_file ); | |
} | |
} | |
if ( 'default.png' === $filename ) { | |
$missing_gravatars[] = $attendee[0] .' '. $attendee[1]; | |
} | |
// Remove the e-mail address from the output file, because it's not used in the badge and InDesign complains about unused fields | |
unset( $attendee[2] ); | |
// Update the final CSV | |
$attendee['filename'] = $destination_directory . $filename; | |
// If they don't have a Twitter handle, add their first name instead. Add a @ to Twitter handles to avoid confusing them with first names. | |
if ( empty ( $attendee[3] ) ) { | |
if ( $replace_empty_twitter ) { | |
$attendee[3] = $attendee[0]; | |
} | |
} else { | |
// Strip out everything but the username, and prefix a @ | |
$attendee[3] = '@' . preg_replace( | |
'/ | |
(https?:\/\/)? | |
(twitter\.com\/)? | |
(@)? | |
/ix', | |
'', | |
$attendee[3] | |
); | |
} | |
fputcsv( $final_csv, $attendee ); | |
// Output progress | |
if ( 0 == $row % 50 ) { | |
echo "\nProcessed " . $row . " attendees."; | |
} | |
// Limit to best case of ~10 iterations per second, to avoid flooding gravatar.com or draining the host server | |
usleep( 100000 ); | |
} | |
fclose( $original_csv ); | |
fclose( $final_csv ); | |
$status = "\nFinished processing " . $row . " attendees.\n"; | |
if ( $missing_gravatars ) { | |
$status .= "\nThe following people did not have a Gravatar:\n\n"; | |
$status .= implode( "\n", $missing_gravatars ); | |
} | |
} else { | |
$status = "Error: Couldn't open files."; | |
} | |
echo "\n". $status ."\n\n"; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment