2015-01-13 4 views
0

Я пытаюсь ajaxify wordpress чистым способом. Идея такова:Wordpress url to html

  1. Запрос Ajax выполняется от клиента к URL-адресу действия ajax (например, /wp/wp-admin/admin-ajax.php?action=my_plugin_fetch_page&page=http://example.com/about).
  2. Ответ на этот запрос должен быть в формате JSON и содержать по адресу наименьшее название страницы и ее содержимое (что эквивалентно http://example.com/about).

Я не могу найти хороший способ получить содержание страницы, зная его URL.

Я пробовал использовать wp_remote_get. Поэтому я просто делаю другой запрос от сервера к URL-адресу http://example.com/about. Это работает, но это довольно медленно (замедление запроса около 2 секунд).

Я пробовал использовать url_to_postid, который преобразует URL-адрес в post_id. К сожалению, это не работает для архивных страниц и, вероятно, будет бесполезно в любом случае, так как мне нужен полный орган ответа от url http://example.com/about, а не только идентификатор эквивалентной страницы.

Это, как он работает в настоящее время с wp_remote_get:

function my_plugin_fetch_page() { 

    /* 
    * 
    * Getting url of target page from GET parameters 
    * 
    */ 
    $url = $_GET['page']; 

    $title = ''; 
    $content = ''; 

    /* 
    * 
    * Url must be set in request parameters and it must be internal link 
    * 
    */ 
    if ($url && my_plugin_is_internal_page($url)) { 

     /* 
     * 
     * Format relative urls to absolute urls. 
     * 
     * test/example -> http://example.com/test/example 
     * 
     */ 
     $url = nolife_single_format_url($url); 

     /* 
     * 
     * Make GET request. 
     * 
     */ 
     $page_response = wp_remote_get($url, array(
      'user-agent' => 'InternalRequester' 
     )); 

     if (! is_wp_error($page_response)) { 

      /* 
      * 
      * Response contains title and page content seperated by some 
      * seperator. By splitting response from that seperator, we 
      * get title and contents of page in seperate values. 
      * 
      */ 
      $content_parts = explode(MY_PLUGIN_SEPERATOR, wp_remote_retrieve_body($page_response)); 

      // title comes first 
      $title = $content_parts[0]; 

      // then content of page 
      $content = $content_parts[1]; 
     } 
    } 

    wp_send_json(array(
     'url'  => $url, 
     'title' => $title, 
     'content' => $content 
    )); 

    die; 
} 

Может кто-нибудь, пожалуйста, помогите мне с этим?

+0

Не использовали, но ['get_page_by_path()'] (http://codex.wordpress.org/Function_Reference/get_page_by_path) более точно, чем 'url_to_postid'? Я предполагаю, что вы можете использовать что-то вроде [this] (http://wordpress.stackexchange.com/questions/9667/get-wordpress-post-content-by-post-id) после того, как у вас есть идентификатор. – Hobo

+0

Спасибо, Хобо за ответ. Похоже, что 'get_page_by_path' не работает, например, с пользовательскими типами сообщений, потому что я не знаю, является ли страница настраиваемым типом сообщения или нет. Все, что я знаю, это URL страницы. :( –

+0

Может быть, избыток, но можете ли вы предоставить массив всех возможных типов сообщений в качестве третьего аргумента? – Hobo

ответ

0

Этого фрагмент кода проверяет, является ли строка существует в какой-либо определенной таксономии, включая свой:

$term = "maybe_a_term"; 
$taxonomies = get_taxonomies(['show_ui' => true]); 
$term_exists = array_reduce($taxonomies, function($carry, $item) use ($term) { 
    return $carry || get_term_by('slug', $term, $item); 
}, false); 

$taxonomies массива сводятся к булеву, так $term_exists будет справедливо, если этот термин найден , Затем вы можете использовать запрос на основе таксономии для сбора сообщений, которые вам нужны.

Примечание: статья ['show_ui' => true] скрывает внутренние таксономии, такие как post_format и nav_menu.

Это безумие, что WordPress не может пересмотреть свои собственные постоянные ссылки.