繁体   English   中英

合并和订购 XML 饲料与 PHP - 加载速度非常慢

[英]Merging and ordering XML feeds with PHP - Very slow to load

在 wordpress 和使用 ACF Pro 中,我将多个 Songkick XML 提要与 PHP 合并,并按艺术家名称对它们进行排序(令人讨厌的是,每个提要都包含艺术家名称)。

我已经设法使用单独的步骤将所有这些放在一起(在此处的不同问题的帮助下),但是页面加载非常缓慢,所以我想知道是否有一种方法可以简化或合并某些步骤?

使用下面的代码,我是:

  • 获取多个 XML 提要(从网站上的其他页面唱 ACF 字段)

  • 将艺术家姓名附加到每个提要

  • 合并提要(同时删除一些数据以尝试加快处理时间)

  • 在按日期排序时将信息输出到表格中

我的代码如下:

<?php

$args = array(
    'post_type'      => 'page',
    'posts_per_page' => -1,
    'post_parent'    => 'artists'
 );


$parent = new WP_Query( $args );

if ( $parent->have_posts() ) : $artistFeedCount = 0; while ( $parent->have_posts() ) : $parent->the_post(); if( get_page_template_slug() == 'template-artist.php' && 'publish' === get_post_status()  ) { 
$singleArtistName = get_the_title();
$singleArtistSongkickRSS = 'https://api.songkick.com/api/3.0/artists/' . get_field('artist_songkick_id') . '/calendar.xml?apikey=XXXXXXXXXXXXXXXX';
$SongkickEvents[]=$singleArtistName;
$SongkickEvents[$singleArtistSongkickRSS] = $SongkickEvents[$artistFeedCount];
unset($SongkickEvents[$artistFeedCount]);
$artistFeedCount++;
?>
<?php }; endwhile; ?>
<?php endif; wp_reset_postdata(); ?>

<?php

$eventsDom = new DOMDocument();
$eventsDom->appendChild($eventsDom->createElement('events'));

foreach ($SongkickEvents as $artist_dates => $artist_name ) {
  $eventsAddDom = new DOMDocument();
  $eventsAddDom->load($artist_dates);

    $events = $eventsAddDom->getElementsByTagName('event');

  if ($eventsAddDom->documentElement) {
    foreach ($events as $event) {


      $eventsDom->documentElement->appendChild(
        $eventsDom->importNode($event, TRUE)
      );
      $artistName = $eventsDom->createElement('mainartist', $artist_name);
        foreach($eventsDom->getElementsByTagName('event') as $singleEvent) { 
        $singleEvent->appendChild($artistName);
        } 
        foreach($eventsDom->getElementsByTagName('performance') as $singlePerformance) {
            $singlePerformance->parentNode->removeChild($singlePerformance);
        }

  }
    }
}

$newXML = $eventsDom->saveXml();

$LiveDates = simplexml_load_string($newXML); 
$eventsArr=array();
foreach($LiveDates->event as $eventsArrSingle)
{
    $eventsArr[]=$eventsArrSingle;
}

usort($eventsArr,function($dstart,$dend){
    return strtotime($dstart->start['date'])-strtotime($dend->start['date']);
});
foreach($eventsArr as $eventsArrSingle) { ?>
    <div class="event-row <?php $eventStatus = $eventsArrSingle['status']; if($eventStatus == 'cancelled' || $eventStatus == 'postponed'): echo 'cancelled'; endif; ?>">
    <div class="event-block event-date">
        <span><?php $eventDate=$eventsArrSingle->start['date']; echo date("d", strtotime($eventDate)); ?></span>
        <?php echo date("M", strtotime($eventDate)); ?>
    </div>
    <div class="event-block event-info">
        <span><?php echo $eventsArrSingle->mainartist; ?></span>
        <?php if($eventsArrSingle->venue['displayName'] != 'Unknown venue'): echo $eventsArrSingle->venue['displayName'] . ', '; endif; ?><?php echo $eventsArrSingle->venue->metroArea['displayName']; ?>
    </div>
    <div class="event-block event-button">
    <a href="<?php echo $eventsArrSingle['uri']; ?>" target="_blank"><span><?php if($eventStatus == 'cancelled'): echo 'Cancelled'; elseif($eventStatus == 'postponed'): echo 'Postponed'; else: echo 'Tickets'; endif; ?></span> <i class="fas fa-arrow-right"></i></a>
    </div>

    </div>

<?php };?>

任何帮助将不胜感激,我相信有一种方法可以在更少的步骤中合并所有内容!

对于遇到相同问题的任何人,这是我使用的解决方案。 使用 Transient API 一次存储饲料 3 小时。

<?php
function eventsFunction() {

  // Do we have this information in our transients already?
  $eventTransient = get_transient( 'eventsTransientData' );

  // Yep!  Just return it and we're done.
  if( ! empty( $eventTransient ) ) {
   echo $eventTransient;

  } else {

$single_artist_ids = array(
    'post_type'      => 'page',
    'posts_per_page' => -1,
    'post_parent'    => 'artists'
 );


$parent = new WP_Query( $single_artist_ids );

if ( $parent->have_posts() ) : $artistFeedCount = 0; while ( $parent->have_posts() ) : $parent->the_post(); if( get_page_template_slug() == 'template-artist.php' && 'publish' === get_post_status()  ) { 
$singleArtistName = get_the_title();
$singleArtistSongkickRSS = 'https://api.songkick.com/api/3.0/artists/' . get_field('artist_songkick_id') . '/calendar.xml?apikey= XXXXXXXXXXXXXXXX';
$SongkickEvents[]=$singleArtistName;
$SongkickEvents[$singleArtistSongkickRSS] = $SongkickEvents[$artistFeedCount];
unset($SongkickEvents[$artistFeedCount]);
$artistFeedCount++;
?>
<?php }; endwhile; ?>
<?php endif; wp_reset_postdata(); ?>

<?php

$eventsDom = new DOMDocument();
$eventsDom->appendChild($eventsDom->createElement('events'));

foreach ($SongkickEvents as $artist_dates => $artist_name ) {
  $eventsAddDom = new DOMDocument();
  $eventsAddDom->load($artist_dates);

    $events = $eventsAddDom->getElementsByTagName('event');

  if ($eventsAddDom->documentElement) {
    foreach ($events as $event) {


      $eventsDom->documentElement->appendChild(
        $eventsDom->importNode($event, TRUE)
      );
      $artistName = $eventsDom->createElement('mainartist', $artist_name);
        foreach($eventsDom->getElementsByTagName('event') as $singleEvent) { 
        $singleEvent->appendChild($artistName);
        } 
        foreach($eventsDom->getElementsByTagName('performance') as $singlePerformance) {
            $singlePerformance->parentNode->removeChild($singlePerformance);
        }

  }
    }
}

$eventsXML = $eventsDom->saveXml();
$LiveDates = simplexml_load_string($eventsXML); 






$eventsArr=array();
foreach($LiveDates->event as $eventsArrSingle)
{
    $eventsArr[]=$eventsArrSingle;
}


usort($eventsArr,function($dstart,$dend){
    return strtotime($dstart->start['date'])-strtotime($dend->start['date']);
});

$eventsStored = '';
foreach($eventsArr as $eventsArrSingle) { 
    $eventsStored .= '<div class="event-row ';
    $eventStatus = $eventsArrSingle['status']; if($eventStatus == 'cancelled' || $eventStatus == 'postponed'): $eventsStored .= 'cancelled'; endif;
    $eventsStored .= '">
    <div class="event-block event-date">
        <span>';
    $eventDate=$eventsArrSingle->start['date']; $eventsStored .= date("d", strtotime($eventDate));
    $eventsStored .= '</span>';
    $eventsStored .= date("M", strtotime($eventDate));
    $eventsStored .= '</div>
    <div class="event-block event-info">
        <span>';
    $eventsStored .= $eventsArrSingle->mainartist;
    $eventsStored .= '</span>';
    if($eventsArrSingle->venue['displayName'] != 'Unknown venue'): $eventsStored .= $eventsArrSingle->venue['displayName'] . ', '; endif;
    $eventsStored .= $eventsArrSingle->venue->metroArea['displayName'];
    $eventsStored .= '</div>
    <div class="event-block event-button">
    <a href="' . $eventsArrSingle['uri'] . '" target="_blank"><span>';
    if($eventStatus == 'cancelled'): $eventsStored .= 'Cancelled'; elseif($eventStatus == 'postponed'): $eventsStored .= 'Postponed'; else: $eventsStored .= 'Tickets'; endif;
    $eventsStored .= '</span> <i class="fas fa-arrow-right"></i></a>
    </div>

    </div>';

};
      set_transient( 'eventsTransientData', $eventsStored, 3*HOUR_IN_SECONDS ); 
      echo $eventsStored;
  }

}

    eventsFunction();
?>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM