Skip to content
Advertisement

Alphabetize Petfinder API List

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

8 People found this is helpful
Advertisement