I’m using the Petfinder API for WordPress plugin. The plugin defaults to listing animals based on how old the Petfinder entries are, from oldest to newest. I’m trying to figure out a way to either do newest to oldest, or alphabetize based on animal names.
The data is loaded via the following code:
function get_petfinder_data($api_key, $shelter_id, $count, $pet = '') { // If no specific pet is specified if ( $pet == '' ) { // Create request URL for all pets from the shelter $request_url = 'http://api.petfinder.com/shelter.getPets?key=' . $api_key . '&count=' . $count . '&id=' . $shelter_id . '&status=A&output=full'; } // If a specific pet IS specified else { // Create a request URL for that specific pet's data $request_url = 'http://api.petfinder.com/pet.get?key=' . $api_key . '&id=' . $pet; } // Request data from Petfinder $petfinder_data = @simplexml_load_file( $request_url ); // If data not available, don't display errors on page if ($petfinder_data === false) {} return $petfinder_data;
And the code that creates the list looks like this:
function get_all_pets($pets) { foreach( $pets as $pet ) { // Define Variables $pet_name = get_pet_name($pet->name); $pet_type = get_pet_type($pet->animal); $pet_size = get_pet_size($pet->size); $pet_age = get_pet_age($pet->age); $pet_gender = get_pet_gender($pet->sex); $pet_options = get_pet_options_list($pet); $pet_description = get_pet_description($pet->description); $pet_photo_thumbnail = get_pet_photos($pet, 'medium'); $pet_photo_all = get_pet_photos ($pet, 'large', false); $pet_more_url = get_site_url() . '/adopt/adoptable-dogs/?view=pet-details&id=' . $pet->id; $pet_pf_url = 'http://www.petfinder.com/petdetail/' . $pet->id; // Create breed classes $pet_breeds_condensed = ''; foreach( $pet->breeds->breed as $breed ) { $pet_breeds_condensed .= pet_value_condensed($breed) . ' '; } // Create options classes $pet_options_condensed = ''; foreach( $pet->options->option as $option ) { $option = get_pet_option($option); if ( $option != '' ) { $pet_options_condensed .= pet_value_condensed($option) . ' '; } } // Compile pet info // Add $pet_options and $pet_breeds as classes and meta info $pet_list .= '<div class="vc_col-sm-3 petfinder ' . pet_value_condensed($pet_age) . ' ' . pet_value_condensed($pet_gender) . ' ' . $pet_breeds_condensed . ' ' . $pet_options_condensed . '">' . '<div class="dogthumbnail">' . '<a href="' . $pet_more_url . '">' . $pet_photo_thumbnail . '</a><br>' . '</div>' . '<a class="dogname" href="' . $pet_more_url . '">' . $pet_name . '</a><br>' . '<span> ' . $pet_age . ' • ' . $pet_gender . '<br>' . '<div class="dogbreed">' . $pet_breeds_condensed . '</div>' . '<a class="morelink" href="' . $pet_more_url . '">Learn More <i class="fas fa-angle-right"></i></a><br>' . '</div>'; } // Return pet list return $pet_list;
Here’s an example of the XML that the Petfinder API spits out (right now there are 25 pet entries in the full thing):
<petfinder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://api.petfinder.com/schemas/0.9/petfinder.xsd"> <header> <version>0.1</version> <timestamp>2018-06-11T17:32:34Z</timestamp> <status> <code>100</code> <message/> </status> </header> <lastOffset>25</lastOffset> <pets> <pet> <id>31035385</id> <shelterId>IL687</shelterId> <shelterPetId/> <name>Chanel</name> <animal>Dog</animal> <breeds>...</breeds> <mix>yes</mix> <age>Adult</age> <sex>F</sex> <size>M</size> <options>...</options> <description>...</description> <lastUpdate>2014-12-14T17:59:49Z</lastUpdate> <status>A</status> <media>...</media> <contact>...</contact> </pet> </pets> </petfinder>
I’d like to sort all entries by either “name” or “lastUpdate”. I’ve been looking at a lot of posts about sorting XML element objects but they either don’t seem to work or I can’t figure out how to apply them specifically to my code. I’m not super well-versed in this stuff, so any assistance is much appreciated!!
Advertisement
Answer
After a LOT of research and trial and error, I figured out how to organize alphabetically by animal name. Posting this in case anybody is ever trying to figure out the same.
First of all, I was wrong in my assumption of which sections I might need to be editing. It was actually line 723 of the plugin file. Here’s how I modified the code for that section:
// Display a list of all available dogs else { // Access Petfinder Data $petfinder_data = get_petfinder_data($api_key, $shelter_id, $count); // If the API returns without errors if( $petfinder_data->header->status->code == '100' ) { // If there is at least one animal if( count( $petfinder_data->pets->pet ) > 0 ) { //Sort list of dogs ALPHABETICALLY by NAME $petSXE = $petfinder_data->pets->children(); $petArray = array(); foreach($petSXE->pet as $d) { $petArray[] = $d; } function name_cmp($a, $b) { $va = (string) $a->name; $vb = (string) $b->name; if ($va===$vb) { return 0; } return ($va<$vb) ? -1 : 1; } usort($petArray, 'name_cmp'); $pets = $petArray; // Compile information that you want to include $petfinder_list = get_type_list($pets). get_age_list($pets) . get_size_list($pets) . get_gender_list($pets) . get_options_list($pets) . get_breed_list($pets) . get_all_pets($pets); }
This is adapting the solution I found in this thread: sort xml div by child node PHP SimpleXML