Alphabetize Petfinder API列表

时间:2018-06-10 21:17:06

标签: php xml wordpress api

我正在使用Petfinder API for Wordpress plugin。该插件默认根据Petfinder条目的年龄从最旧到最新列出动物。我正试图找出一种方法,可以做最新到最旧,或基于动物名称的字母顺序。

通过以下代码加载数据:

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;

创建列表的代码如下所示:

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;

以下是Petfinder API吐出的XML示例(现在全部有25个宠物条目):

<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>

我想通过“name”或“lastUpdate”对所有条目进行排序。我一直在看很多关于排序XML元素对象的帖子,但它们要么似乎不起作用,要么我无法弄清楚如何将它们专门应用于我的代码。我不是非常精通这些东西,所以非常感谢任何帮助!!

1 个答案:

答案 0 :(得分:0)

经过大量的研究和反复试验后,我想出了如何按动物名称按字母顺序排列。发布这个以防任何人试图找出相同的。

首先,我在假设哪些部分可能需要编辑时出错了。它实际上是插件文件的第723行。以下是我修改该部分代码的方法:

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

    }

这正在调整我在此主题中找到的解决方案:sort xml div by child node PHP SimpleXML