使用高级自定义字段中的关系字段,我将艺术家链接到事件。这些艺术家和活动都是自定义的帖子类型。对于每个事件,相关美工人员的帖子ID作为自定义元字段(lineup\\u美工人员)存储在一个数组中。
在每个活动页面上,我列出了所有艺术家。当你点击一个艺术家时,我想显示你能找到这个艺术家的所有事件(通过一个AJAX调用,它以引导模式显示结果)。我已经测试了AJAX调用,它正常工作,但查询有问题(需要很长时间才能完成)。
在我的职能中,我有:
$ArtistID = $_POST[\'ArtistID\']; // Gets the ArtistID from the AJAX call
$meta_query = array(
\'key\' => \'lineup_artists\',
\'value\' => \'"\' . $ArtistID .\'"\',
\'compare\' => \'LIKE\'
);
$args = array(
\'post_type\' => \'events\',
\'meta_query\' => array($meta_query),
\'posts_per_page\' => 5,
\'post_status\' => \'publish\',
);
如果转储wp\\U查询的结果,则会得到以下sql查询:
SELECT SQL_CALC_FOUND_ROWS yt_posts.ID FROM yt_posts
INNER JOIN yt_postmeta ON (yt_posts.ID = yt_postmeta.post_id)
WHERE 1=1
AND yt_posts.post_type = \'events\'
AND (yt_posts.post_status = \'publish\')
AND ( (yt_postmeta.meta_key = \'lineup_artists\' AND CAST(yt_postmeta.meta_value AS CHAR) LIKE \'%\\"17497\\"%\') )
GROUP BY yt_posts.ID ORDER BY yt_posts.post_date DESC LIMIT 0, 5
当我将这个查询粘贴到phpmyadmin中时,它需要很长时间才能完成(我从未见过它完成,因为它需要很长时间)。
这是因为艺术家ID存储为数组吗?有人告诉我,这不是很有效,这些关系应该存储在一个单独的表中(我不知道怎么做)。我的查询是否有问题,或者这是一种非常低效的查询关系的方法?
<小时>EDIT: 回复kaiser(以ACDC为例:-)):
在我的活动页面中,我为每个艺术家提供了这个html/php(每个活动页面上可以有100多名艺术家)。$artistID
和$artistName
在中生成foreach
循环。):
<a class="yt-artist" data-target="#modalArtist" data-toggle="modal" id="ArtistAttr" data-id="<?php echo $artistID; ?>" data-name="<?php echo $artistName ?>"><?php echo $artistName; ?></a>
此代码是在
foreach
循环获取所有艺术家:
$lineup = get_sub_field(\'lineup_artists\'); // The relationship artists are in a repeater field
if($lineup):
foreach($lineup as $artist):
<a class=... etc
这将导致:
<a class="yt-artist" data-target="#modalArtist" data-toggle="modal" id="ArtistAttr" data-id="17497" data-name="ACDC">ACDC</a>
因此,单击艺术家会显示模式,当显示模式时,会触发AJAX js:
jQuery(document).ready(function()
{
$(document).on(\'click\',\'.yt-artist\',function()
{
var ArtistID = $(this).data(\'id\');
var ArtistName = $(this).data(\'name\')
$(\'#modalArtist\').on(\'shown\',function()
{
jQuery.ajax(
{
type: \'POST\',
url: \'http://xxx/wp-admin/admin-ajax.php\',
data:
{
action: \'yt_ajax_artist_events_eventpage\',
ArtistID: ArtistID,
ArtistName: ArtistName,
},
success: function(data, textStatus, XMLHttpRequest)
{
jQuery(\'#modalArtist\').html(data);
},
error: function(MLHttpRequest, textStatus, errorThrown)
{
alert(errorThrown);
}
});
});
});
以及函数(包括一些要在模式中插入的HTML):
function yt_ajax_artist_events_eventpage(){
$ArtistID = $_POST[\'ArtistID\'];
$ArtistName = $_POST[\'ArtistName\'];
$meta_query = array(
\'key\' => \'lineup_artists\',
\'value\' => $ArtistID,
\'compare\' => \'LIKE\'
);
$args = array(
\'post_type\' => \'festivals\',
\'meta_query\' => array($meta_query),
\'posts_per_page\' => 5,
\'post_status\' => \'publish\',
);
$results = \'
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h2>\'.$ArtistName.\'</h2>
</div>
<div class="modal-body">\';
$loop = new WP_Query($args);
while ($loop->have_posts()) : $loop->the_post();
$results .= \'<h3>\'.get_the_title().\'</h3>\';
endwhile;
wp_reset_query();
$results .= \'</div>\';
die($results);
}
add_action( \'wp_ajax_nopriv_yt_ajax_artist_events_eventpage\', \'yt_ajax_artist_events_eventpage\' );
add_action( \'wp_ajax_yt_ajax_artist_events_eventpage\', \'yt_ajax_artist_events_eventpage\' );