Откройте Thickbox с содержимым через AJAX

11

Я добавил пользовательскую кнопку в редактор TinyMCE, и я хочу открыть Thickbox WP, когда я нажму на нее.

Как я могу сделать так, чтобы tb_show()функция загружала содержимое, которое я хочу, с помощью ajax?

// the ajax
add_action('wp_ajax_getTheContent', 'getTheContent');
function getTheContent(){
  echo 'weqwtegeqgr'; // <- this should be displayed in the TB
  die();
}

Вот некоторый код плагина редактора, который я использую:

init : function(ed, url) {
  ed.addButton('do_stuff', {
    title : 'Do Stuff',
    image : url + '/icon.gif',
    onclick : function() {
        OpenMyThickbox('do_stuff');
    }
  });
...

Так что OpenMyThickboxфункция javascript должна делать то, что я хочу:

function OpenMyThickbox(tag){
  tb_show(tag, '...'); // <- how to load content trough ajax here ?
}
onetrickpony
источник
использовать admin_url ('admin-ajax.php'); для URL
Bainternet
Я получаю пустую страницу. даже если я
захожу на

Ответы:

6

Вторым параметром для tb_showявляется URL, поэтому вы захотите использовать что-то вроде ..

<?php 
$ajax_url = add_query_arg( 
    array( 
        'action' => 'getTheContent', 
        'query_var1' => 'value1', 
        'query_var2' => 'value2' 
    ), 
    admin_url( 'admin-ajax.php' ) 
); 
?>
tb_show(tag, '<?php echo $ajax_url; ?>' );

Я предполагаю, что вам нужно передать действие и любые дополнительные переменные запроса вручную (как указано выше), иначе ваш запрос просто для admin-ajax.php, когда то, что вы ищете, является чем-то вроде ... admin-ajax.php?action=getTheContent&someothervar=someothervalue, отсюда и add_query_argиспользование выше. ,

В целях разъяснения:

Следующий звонок add_query_arg...

add_query_arg( 
    array( 
        'action' => 'getTheContent', 
        'query_var1' => 'value1', 
        'query_var2' => 'value2' 
    ), 
    admin_url( 'admin-ajax.php' ) 
);

Это эквивалентно и будет производить ...

http://example.com/wp-admin/admin-ajax.php?action=getTheContent&query_var1=value1&query_var2=value2

Однако!

Объяснив себя, я пришел к выводу, что нам не нужен абсолютный URL-адрес, и, следовательно, нам не нужен звонок admin_urlтуда. Код должен быть вместо.

<?php 
$ajax_url = add_query_arg( 
    array( 
        'action' => 'getTheContent', 
        'query_var1' => 'value1', 
        'query_var2' => 'value2' 
    ), 
    'admin-ajax.php'
); 
?>
tb_show(tag, '<?php echo $ajax_url; ?>'); 

Таким образом, полученный URL выглядит примерно так ...

admin-ajax.php?action=getTheContent&query_var1=valu1&query_var2=value2

Функции, указанные в приведенных выше примерах кода:

t31os
источник
Не будет ли это $_get['action']потому, что ищет ajax-вызов WordPress $_post['action']? или я не прав?
Bainternet
Это будет $_POSTили $_REQUESTвнутри обратного вызова ajax, как правило, если вы явно не установите свою функцию запроса ajax для использования getвместо нее, в контексте вызова Thickbox мы используем строку запроса, которая все равно должна отображаться в $_REQUEST(потому что обычно содержит $_GETи $_POST) ..
t31os
Нет, я спрашиваю, если я использую, add_query_argбудут ли добавленные аргументы отправлены как сообщение или получено?
Bainternet
Кроме того, add_query_argдобавляет строку (URL-адрес) с параметрами запроса, он не выполняет отправку, поэтому я не уверен, что понимаю ваш вопрос ..
t31os
Обновлено мой ответ ..
t31os
3

Испортить JavaScript и PHP не очень умно. Этот ответ только смущает.

tb_show - это JavaScript. add_query_arg - это PHP.

так что это решение действительно только в PHP и правильный код

...
?>
tb_show(
  'whatever',
  <?php echo add_query_arg( array(
    'action' => 'getTheContent',
    'query_var1' => 'value1',
    'query_var2' => 'value2',
  ), 'admin-ajax.php'); ?>
);
<?php
...

А в javascript вообще недопустимо, так как мы не можем использовать add_query_arg

bayen
источник
Где это отличается от решения, в котором есть <?php ?>теги? Если это все, на что вы хотите обратить внимание, внесите изменения в решение, чтобы исправить это. Не нужно добавлять отдельный ответ, чтобы объяснить, что не так с другим ответом. Вот почему правки сообщества приветствуются.
Кайзер
@kaiser Редактирование, изменяющее значение сообщения, обычно не приветствуется. В качестве отдельного ответа это нормально.
fuxia
@toscho И как именно это меняет смысл ? Imo это исправить или добавить недостающие биты .
Кайзер
Байен был прав, когда указал на ошибку: я смешивал PHP и Javascript, и мне действительно следовало заметить это раньше. Я внес необходимые изменения в свой ответ, и спасибо за обратную связь (я хотел бы знать, когда я делаю ошибки).
t31os