【发布时间】: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 之后,这解决了我的问题,我的页面加载速度非常快,感谢您的帮助