Надо мне тут для одного проекта вывести пост в модальном окне, для каждого поста свой конечно же. Но дело такое, я ни фига не по AJAX’у и javascript, и в wordpress с ajax всё сложно из-за видимости функций его самого. Начал искать что да как… А на просторах рунета ничего нет (типичная проблема) и то, что на «инглише» тоже не алё. Пришлось писать самому. И теперь после всей боли и страданий делюсь практикой создания подобного. Сразу оговорюсь, что вёрстка проекта на bootstrap и вызывал модалку его методами.
Первое, разберёмся как вообще выводить записи wordpress в его цикле и для чего это нужно. Нужно это для того, чтобы не возникало проблем с вызовом таких функций, как the_title(), get_the_post_thumbnail(), the_content() и т.д.
Если вы будете выводить их не в цикле, то придётся пользоваться «всяким», чтобы у вас выводилось нужное вместо undefine
Приведённый ниже код мы можем выводить где угодно в файлах, к которым подключена шапка сайта.
$args = array( 'p' => $postID, // ID поста 'post_type' => 'any' ); $recent = new WP_Query($args); while ( $recent->have_posts() ) : $recent->the_post();?> <!--Вывод поста функциями, например, the_title(); --> <?php endwhile; ?>
где p — это id поста
Чтобы подключить вашу функцию AJAX в wordpress, нужно в файле function.php дописать пару строк.
// в functions.php add_action('wp_ajax_my_action', 'data_fetch'); add_action('wp_ajax_nopriv_my_action', 'data_fetch');
my_action можете заменить любым другим именем, наверно даже со SLUG’ом вашей темы. data_fetch — это та функция которую вы будете объявлять для исполнения.
Объявляем data_fetch(); в файле function.php после строк, которые мы написали ранее
function data_fetch($postID){ $postID=intval( $_POST['param'] ); $args = array( ‘p’ => $postID, // ID of a page, post, or custom type //’post_type’ => ‘any’ ); $recent = new WP_Query($args); while ( $recent->have_posts() ) : $recent->the_post();?> <div class=»modal-header»> <button type=»button» class=»close» data-dismiss=»modal» aria-label=»Close»><span aria-hidden=»true»>×</span></button> <?php the_title( ‘<h2 class=»modal-title text-center»>’, ‘</h2>’ ); ?> </div> <div class=»row»> <div class=»col-lg-3″> <img src=»<?php echo get_the_post_thumbnail_url(); ?>» class=»instaupp-img img-circle»> </div> <div class=»col-lg-9″> <p><i>Описание</i></p> <?php the_content(); ?> </div> </div> <?php endwhile; ?> <?php die(); }
У меня получилась такая функция: $postID=intval( $_POST[‘param’] ); мы будем ловить с помощью jquery уже на странице и передавать функции. Ещё, в функции я вывел несколько элементов в цикле wordpress’а :
<?php the_title( '<h2 class="modal-title text-center">', '</h2>' ); ?>
— заголовок записи;
<?php echo get_the_post_thumbnail_url(); ?>
— cсылка на миниатюру записи; <?php the_content(); ?> — содержание записи. Всё остальное в функции — вёрстка.
Забыл сказать, что для работы всего этого нужно jquery. Но если у вас bootstrap, то вы и так подключили его еще на стадии вёрстки.
По идее, правильным способом было подключить все скрипты через функцию wp_enqueue_scripts(), но т.к. я торопился, то сделал «дерьмокод» и просто объявил функцию ftdfft(); и вызвал её вот так add_action(‘wp_footer’,’ftdfft’, 1000). Так делать нельзя. 1000 в подключении — это приоритет. Чтобы подключалось в самом конце
Содержание скриптов:
1-й
<script> function fetch(e){var param = $(e.target).attr('data-ajax-param'); // Находим id поста по нажатию кнопки. У кнопки должен быть атрибут data-ajax-param равный id поста, например, data-ajax-param="11" $.post('wp-admin/admin-ajax.php', {'action':'my_action', 'param':param}, function(response){ $('.modal-content.ajax').html(response); }); } </script>
2-й
<script> $( '[data-ajax-param]' ).click(function (e) { fetch(e); }); </script>
‘param’:param это то, что мы передаём функции data_fetch($postID) и она передаётся как id поста. .modal-content.ajax — это селектор блока, в который будет вставляться контент вашей записи.
Выведите html модельного окна в вёрстке страницы, на которой будет всё происходить. Не забудьте, что у блока, в котором будет выводиться контент, должен быть class=»modal-content ajax»
В дата data-ajax-param нужно вывести id записи. Если ваша кнопка выводится в цикле, то можно вывести вот так — <?php the_ID(); ?>
У той же кнопки, что и имеет ID нужно приписать вызов модалки, например, data-toggle=»modal» data-target=».bs-example-modal-lg», конечно же, указав правильный селектор вашего модального окна. Если вы не на bootrap, то думайте сами.