【问题标题】:Merging and ordering XML feeds with PHP - Very slow to load使用 PHP 合并和排序 XML 提要 - 加载速度非常慢
【发布时间】:2020-09-27 07:38:10
【问题描述】:

在 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 };?>

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

【问题讨论】:

  • 这是你不应该在每次页面加载时都做的事情,但你应该将结果缓存在某个地方。
  • 感谢您的回复,在某处缓存结果的最佳方式是什么?你能给我举个例子吗?
  • codex.wordpress.org/Transients_API 是在 WP 中处理此类事情的好方法。
  • 啊哈,在查看了 WP Transients API 之后,这解决了我的问题,我的页面加载速度非常快,感谢您的帮助

标签: php xml wordpress foreach


【解决方案1】:

对于遇到相同问题的任何人,这是我使用的解决方案。使用 Transient API 一次将 Feed 存储 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();
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 2021-02-08
    • 2012-02-25
    • 1970-01-01
    相关资源
    最近更新 更多