Как преобразовать результаты WP_Query (Custom Post Type, с пользовательскими полями) в JavaScript?

Я использую DataTables на этой странице .

Он отлично работает, за исключением того, что у меня возникли проблемы с работой дочерних строк.

Я считаю, что мне нужно сделать, чтобы преобразовать результаты WP_Query с соответствующими настраиваемыми полями в массив JavaScript.

Достаточно легко получить результаты WP_Query таким образом, но когда вы добавляете настраиваемые поля в микс, я застрял.

Любые идеи о том, как это можно сделать? Вы можете увидеть исходный код для этой страницы.

Solutions Collecting From Web of "Как преобразовать результаты WP_Query (Custom Post Type, с пользовательскими полями) в JavaScript?"

как написать WP_Query, который возвращает пользовательские данные поля

Это обычно не требуется. Вы можете просто получить доступ к метаданным для каждого сообщения в запросе индивидуально (как вы уже делали). Вы также можете перебирать запрос более одного раза на странице (он перематывается автоматически, это то, что while( have_posts() ) часть while( have_posts() ) ).

Если вас интересует аспект производительности – доступ к метаданных сильно кэшируется в памяти (или кеше объектов). Извлечение метаданных в несколько раз при загрузке страницы не приведет к дублированию запросов, оно будет извлекаться только один раз и повторно использоваться.

Ниже приведен упрощенный пример того, что вы можете сделать: Используйте JsonSerializable :

 class \JsonQuery extends \WP_Query implements \JsonSerializable { public function jsonSerialize() { return array_map( function( \WP_Post $post ) { return array_merge( $post->to_array(), get_post_custom( $post->ID ) ); }, $this->get_posts() ) } } 

Это так просто, как это (… выше). Теперь просто запросите все, что вам нужно, и

 // Enqueue script here! $query = new \JsonQuery( [ /* arguments you use in normal \WP_Query */ ] ); wp_localize_script( 'script-handle', 'globalJsVarName', json_encode( $query ) ); 

Затем у вас есть ваш JSON-кодированный запрос наряду со всеми пользовательскими данными.

Заметка:

  1. Выше код не проверен (на самом деле у меня было два телефонных звонка между ними, так что он может быть немного отключен здесь и там)
  2. Убедитесь, что вы запустили скрипт, чтобы вы могли локализовать данные для него.
  3. Убедитесь, что вы либо поместили JS в нижний колонтитул (последний аргумент при регистрации), либо запросите достаточно рано – не уверен, что это работает.

редактировать

Возможно, вы захотите написать Decorator для \WP_Query а не расширять его. Интернет расскажет вам о плюсах / минусах, поэтому не нужно повторять его здесь.

Хорошо, я ДУМАЮ, Я понимаю, о чем вы просите, не стесняйтесь сказать мне, что я в левом поле.

Прежде всего, вы захотите взглянуть на это: https://aarontgrogg.com/blog/2015/12/16/getting-to-know-and-adding-json-ld-to-a-wordpress- сайт /

Теперь я использовал это специально для получения данных Schema Data, но я считаю, что вы можете доставлять другие типы полезных нагрузок, например javascript.

Главный вопрос заключается в том, как получить данные пользовательского поля в вашу полезную нагрузку, и я думаю, что вы действительно спрашиваете?

Во всяком случае, используя метод, описанный в этой ссылке, чтобы создать мой json, я получил это в своей голове –

 <?php include('json-ld.php');?> <script type="application/ld+json"><?php echo json_encode($payload); ?></script> 

Затем в моем файле json-ld.php у меня есть следующее:

 <?php // JSON - LD for Reaction // Global Call function get_post_data() { global $post; return $post; } $post_data = get_post_data(); $payload["@context"] = "http://schema.org/"; //blog posts if (is_singular('post')) { //variables for the post $post_url = get_permalink(); $post_thumb = wp_get_attachment_url(get_post_thumbnail_id($post->ID)); $excerpt= get_the_excerpt($post->ID); // grab the post excerpt. $author_select = get_field('author', $post->ID); $moddatetime = new DateTime($post_data->post_date); // getting the team member if ($author_select == 'reaction') { $postauthor = 'Reaction'; } else if ($author_select == 'guest') { $postauthor = get_field('guest_writer_name', $post->ID); } else { $author = get_field('team_member', $post->ID); foreach($author as $member) { $postauthor = $member->post_title; } } // getting the tags $posttags = get_the_tags(); if ($posttags) { foreach($posttags as $tag) { $value .= $tag->name . ', '; } } $value = rtrim($value,', '); //payload $payload["@type"] = "blogPost"; $payload["url"] = $post_url; $payload["creator"] = array( "@type" => "Person", "name" => $postauthor, // outputs my post author as per the calls above ); $payload["headline"] = $post_data->post_title; // works $payload["datePublished"] = $moddatetime->format(DateTime::ISO8601); // works $payload["image"] = $post_thumb; $payload["description"] = $excerpt; // works $payload["about"] = $value; // works } // home page if (is_front_page()) { $logourl = get_site_url(); $payload["@type"] = "Organization"; $payload["name"] = "Reaction Marketing"; $payload["logo"] = $logourl . '/reaction-logo.png'; $payload["url"] = get_site_url(); $payload["sameAs"] = array("http://twitter.com/reaction", "https://www.facebook.com/ReactionMarketing", "http://www.linkedin.com/company/reaction-marketing"); $payload["contactPoint"] = array(array("@type" => "ContactPoint", "telephone" => "+1 403 346 6580", "email" => "info@reaction.ca", "contactType" => "sales")); } ?> 

Мой конечный результат – это схема, соответствующая странице и сообщению. Пример вывода на главную страницу здесь:

 <script type='application/ld+json'>{"@context":"http:\/\/schema.org","@type":"WebSite","url":"http:\/\/reaction.ca\/","name":"Reaction","alternateName":"Reaction","potentialAction":{"@type":"SearchAction","target":"http:\/\/reaction.ca\/?s={search_term_string}","query-input":"required name=search_term_string"}}</script> <script type='application/ld+json'>{"@context":"http:\/\/schema.org","@type":"Organization","url":"http:\/\/reaction.ca\/","sameAs":["https:\/\/www.facebook.com\/ReactionMarketing","https:\/\/www.instagram.com\/reaction","https:\/\/www.linkedin.com\/company\/reaction-marketing","https:\/\/twitter.com\/reaction"],"name":"Reaction Marketing","logo":"http:\/\/reaction.ca\/uploads\/REACTION-RGB.jpg"}</script> 

Теперь, очевидно, это специфично для схемы, но вы можете видеть там, что я назвал данные конкретными для разных настраиваемых полей (используя ACF). Вы можете видеть, как мои переменные вызываются в сообщениях в блогах.

Кажется, это соответствует тому, что вы просите?