Intereting Posts

Запрос отношения wordpress ajax

Используя поле отношений из дополнительных пользовательских полей, я связываю художников с событиями. Оба этих исполнителя и события являются обычными типами сообщений. Для каждого события идентификаторы сообщений связанных художников хранятся в массиве как настраиваемое мета-поле (lineup_artists).

На каждой странице событий я перечисляю всех художников. Когда вы нажимаете на исполнителя, я бы хотел показать все события, где вы можете найти этого исполнителя (через вызов 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_query, я получаю следующий запрос 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, это занимает очень много времени (я никогда не видел, чтобы он заканчивался, потому что он длился так долго).

Это потому, что идентификаторы исполнителя хранятся в виде массива? Кто-то сказал мне, что это не очень эффективно и что эти отношения должны храниться в отдельной таблице (что я не знаю, как это сделать). Что-то не так с моим запросом или это очень неэффективный способ запроса отношений?


EDIT: В ответ на вопрос кайзера (давайте использовать 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' ); 

Solutions Collecting From Web of "Запрос отношения wordpress ajax"

Посмотрите на самую последнюю часть этого запроса – LIKE '%\"17497\"%' . Вы ищете любые символы, за которыми следует буквально "17497" , за которыми следуют любые символы. Я уверен, что это не то, что вы хотите. Я думаю, что вам нужны персонажи, за которыми следует 17497 без кавычек, за которыми следуют любые персонажи.

Это означает, что meta_query написано неправильно.

 $meta_query = array( 'key' => 'lineup_artists', 'value' => $ArtistID, 'compare' => 'LIKE' ); 

Вы не хотите добавлять свои собственные цитаты.

Вы также хотите проверить, что $ArtistID имеет значение, прежде чем пытаться его использовать, и перед использованием информации в $_POST вы должны выполнить некоторую дезинфекцию и проверку данных. Данные $_POST не являются безопасными данными.

Просто прочитав документацию, я увидел, что есть 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'] ) ) ); 

Запрос LIKE на meta_values ​​будет очень медленным, несмотря на то, что вы делаете.

В основном это не предполагаемое использование метазначений. Значения метаданных не индексируются. Мета-ключи индексируются. Значения предназначены для отображения данных или их использования, а не данных, которые запрашиваются.

Вам лучше хранить данные в качестве пользовательской таксономии, если вам нужно запросить ее таким образом. Таксономии будут намного быстрее в отношении вашего запроса. Тем не менее, вам нужно будет сделать некоторое пользовательское кодирование, по-видимому, вместо того, чтобы использовать ACF для генерации кода для вас.

Я обсуждал эту проблему с автором ACF. Проблема была; невозможно запросить поле отношений с пользовательскими типами сообщений, которое находится в поле повторителя. Поэтому $lineup = get_sub_field('lineup') не будет работать.

Если поле отношения находится на корневом уровне, это meta_query:

 $meta_query = array( 'key' => 'lineup_artists', 'value' => '"' . $ArtistID .'"', 'compare' => 'LIKE' ); 

будет работать. Другой вариант, который дал автор, – использовать плагин posts2posts. Он создает таблицу в DB DB для отношений, и у нее есть API для запроса их, который работает очень хорошо.