WordPress AJAX关系查询

时间:2013-08-18 作者:eskimo

使用高级自定义字段中的关系字段,我将艺术家链接到事件。这些艺术家和活动都是自定义的帖子类型。对于每个事件,相关美工人员的帖子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\' );

4 个回复
最合适的回答,由SO网友:eskimo 整理而成

我一直在和ACF的作者讨论这个问题。问题是;无法查询具有位于repeater字段中的自定义帖子类型的关系字段。因此$lineup = get_sub_field(\'lineup\') 行不通。

如果关系字段位于根级别,则此meta\\u查询:

$meta_query = array(
    \'key\'       => \'lineup_artists\',
    \'value\'     => \'"\' . $ArtistID .\'"\',
    \'compare\'   => \'LIKE\'
);
将起作用。作者给出的另一个选择是使用posts2posts插件。它在WP-DB中为关系创建一个表,并有一个API来查询它们,这个API工作得非常好。

SO网友:s_ha_dum

请看该查询的最后一部分--LIKE \'%\\"17497\\"%\'. 您正在搜索任何字符,后跟字面"17497", 后跟任意字符。我很确定这不是你想要的。我想你想要任何字符,后跟17497 不带引号,后跟任何字符。

这意味着meta_query 写入错误。

$meta_query = array(
    \'key\'       => \'lineup_artists\',
    \'value\'     => $ArtistID,
    \'compare\'   => \'LIKE\'
);
你不想这样添加自己的报价。

你还想检查一下$ArtistID 在尝试使用之前具有值,并且在中使用信息之前,您应该进行一些数据清理和验证$_POST. $_POST 数据is not 安全数据。

SO网友:kaiser

仅仅通过阅读文档,我看到get_field(\'relationship\').

$related = get_field( \'relationship\' );
foreach ( $related as $r )
{
    setup_postdata( $r );

    // Do stuff
}
wp_reset_postdata();
在AJAX回调中,您也可以这样简单地调用它:

$related = get_field( \'relationship\', get_the_ID() );
或者获取与特定艺术家相关的帖子,以防您ArtistID 是正确的-带有

$related = get_field( \'relationship\', absint( esc_attr( $_POST[\'ArtistID\'] ) ) );

SO网友:Otto

无论您做什么,对meta\\u值的LIKE查询都会非常慢。

基本上,这不是元值的预期用途。元数据没有索引。元键被索引。值旨在显示或使用的数据,而不是查询的数据。

如果需要以这种方式查询数据,最好将其存储为自定义分类法。分类法将比查询更快。然而,您可能需要进行一些自定义编码,而不是使用ACF为您生成代码。

结束
WordPress AJAX关系查询 - 小码农CODE - 行之有效找到问题解决它

WordPress AJAX关系查询

时间:2013-08-18 作者:eskimo

使用高级自定义字段中的关系字段,我将艺术家链接到事件。这些艺术家和活动都是自定义的帖子类型。对于每个事件,相关美工人员的帖子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\' );

4 个回复
最合适的回答,由SO网友:eskimo 整理而成

我一直在和ACF的作者讨论这个问题。问题是;无法查询具有位于repeater字段中的自定义帖子类型的关系字段。因此$lineup = get_sub_field(\'lineup\') 行不通。

如果关系字段位于根级别,则此meta\\u查询:

$meta_query = array(
    \'key\'       => \'lineup_artists\',
    \'value\'     => \'"\' . $ArtistID .\'"\',
    \'compare\'   => \'LIKE\'
);
将起作用。作者给出的另一个选择是使用posts2posts插件。它在WP-DB中为关系创建一个表,并有一个API来查询它们,这个API工作得非常好。

SO网友:s_ha_dum

请看该查询的最后一部分--LIKE \'%\\"17497\\"%\'. 您正在搜索任何字符,后跟字面"17497", 后跟任意字符。我很确定这不是你想要的。我想你想要任何字符,后跟17497 不带引号,后跟任何字符。

这意味着meta_query 写入错误。

$meta_query = array(
    \'key\'       => \'lineup_artists\',
    \'value\'     => $ArtistID,
    \'compare\'   => \'LIKE\'
);
你不想这样添加自己的报价。

你还想检查一下$ArtistID 在尝试使用之前具有值,并且在中使用信息之前,您应该进行一些数据清理和验证$_POST. $_POST 数据is not 安全数据。

SO网友:kaiser

仅仅通过阅读文档,我看到get_field(\'relationship\').

$related = get_field( \'relationship\' );
foreach ( $related as $r )
{
    setup_postdata( $r );

    // Do stuff
}
wp_reset_postdata();
在AJAX回调中,您也可以这样简单地调用它:

$related = get_field( \'relationship\', get_the_ID() );
或者获取与特定艺术家相关的帖子,以防您ArtistID 是正确的-带有

$related = get_field( \'relationship\', absint( esc_attr( $_POST[\'ArtistID\'] ) ) );

SO网友:Otto

无论您做什么,对meta\\u值的LIKE查询都会非常慢。

基本上,这不是元值的预期用途。元数据没有索引。元键被索引。值旨在显示或使用的数据,而不是查询的数据。

如果需要以这种方式查询数据,最好将其存储为自定义分类法。分类法将比查询更快。然而,您可能需要进行一些自定义编码,而不是使用ACF为您生成代码。

相关推荐

如何将WordPress配置为与Microsoft SQL Server数据库对话?

我们正在我们的intranet站点上构建WordPress站点,并希望将其连接到Microsoft SQL Server。我已经在IIS上下载并配置了PHP和PHP管理器。我还从键入此线程标题时弹出的已回答问题列表中下载了SQL Server DLL。我按照指示在PHP文件夹中下载了这些DLL。当我启动服务器地址以安装WordPress时,系统会提示我提供SQL DB名称、用户名、密码和DB主机名。我还下载了wp-db抽象插件,将wp-db抽象化。php文件放入WordPress文件保存的文件夹中,按照我