Создание XML-файлов на экране редактирования записи
Хорошо, это странный вопрос, я знаю..
Мне так комфортно с WP, что я не хочу использовать какое-либо другое приложение для создания XML (KML - Редакторы примечание: Это файлы Google Планета Земля.) файлы.
Я хочу использовать пользовательский тип записи, в котором нет ничего, кроме набора пользовательских полей и мета-полей. У меня есть XML-схема (пользовательская single.php ) настройка: определенные значения настраиваемых полей находятся между правильными XML-тегами, и теоретически у меня есть XML, который я возможность создавать, изменять и удалять с помощью WP.
Проблема в том, что это все еще файл php/html, а не xml, и браузер использует его как файл html/php и пытается интерпретировать его как html, даже если xml объявлен вверху.
Есть ли библиотека или способ захватить вывод html этих файлов и каким-то образом преобразовать его в XML?
Спасибо.
ОБНОВЛЕНИЕ 1: Вот как я получаю имя метки (оно дает вам имя), но без теги:
<?php if(get_field('marker_style')): ?>
<?php while(the_repeater_field('marker_style')): ?>
<?php echo '<name>' the_sub_field('marker_style_id') '</name>' ;?>
<?php endwhile; ?>
<?php endif; ?>
Обновление 2: С помощью учебника я придумал этот код: http://pastebin.com/zGJHm19t
Но это не работает. Похоже, что я не могу хранить значения своих полей в переменных и использовать их на странице в этом контексте. Вы можете подумать, что это из-за плагина, который я использую для пользовательских полей, но это не так: если я добавлю простой $title = the_title()
, а затем попытаюсь повторить $title
, я ничего не получу.
В строке 39-42 в оригинальном учебнике приведены значения они сами и XML были прекрасно ими заполнены. Логика здесь заключается в том, что я храню значения в переменных и использую здесь переменные, но, как я уже упоминал, по какой-то причине, которую я сейчас не вижу, переменные пусты.
1 answers
Если вы используете XML для отправки Ajax-запросов, то в WP есть что-то встроенное:
$response = new WP_Ajax_Response();
$response->add( array(
// This is the parent elements name
'what' => 'xml_parent_el'
// 'data' can only pass CDATA
,'data' => $foo
// 'supplemental' can only pass elements with a unique name
,'supplemental' => $bar
) );
$response->send();
Если речь идет о вызовах ajax, используйте JSON.
Проблема с этим - из-за внутренней архитектуры wp xml ajax - заключается в том, что вы не можете отправлять несколько элементов с одинаковым именем. Wordpress нуждается в ассоциативном массиве, где ключи - это имена элементов и значения... ну и ценности. Таким образом, называние этих элементов ключами точно так же переопределило бы предыдущее элемент.
<xml_parent_el>
<single_el attr="whatever a">Value A</single_el>
<single_el attr="whatever b">Value B</single_el>
<single_el attr="whatever c">Value C</single_el>
</xml_parent_el>
Ваш лучший выбор в этом случае - использовать SimpleXML
класс, предоставляемый php.
РЕДАКТИРОВАТЬ: После просмотра вставки, вот исправленная версия. Там могут быть опечатки.
<?php
$placemarks = Array();
$kml_query = new WP_Query( 'post_type=kml' );
while ( $kml_query->have_posts() )
{
$kml_query->the_post();
if( get_field('marker_datas') )
{
while( the_repeater_field('marker_datas') )
{
$placemarks[ the_sub_field_return('placemark_name') ] = array(
'description' => the_sub_field_return( 'placemark_text' )
,'styleUrl' => the_sub_field_return( 'placemark_style_id' )
,'coordinates' => the_sub_field_return( 'placemark_coordinates' )
);
}
}
}
// Document
$xmlDoc = new DOMDocument();
// Root element
$root = $xmlDoc->appendChild( $xmlDoc->createElement("Document") );
foreach( $placemarks as $name => $data )
{
// Tag
$markerTag = $root->appendChild( $xmlDoc->createElement("Placemark") );
$markerTag->appendChild( $xmlDoc->createElement( "Name", $name ) );
$markerTag->appendChild( $xmlDoc->createElement( "Description", $data['description'] ) );
$markerTag->appendChild( $xmlDoc->createElement("styleUrl", $data['styleUrl'] ) );
// Coordinates
$coordTag = $markerTag->appendChild( $xmlDoc->createElement( "Point" ) );
$coordTag->appendChild( $xmlDoc->createElement( "coordinates", $data['coordinates'] ) );
}
header("Content-Type: text/plain");
// make the output pretty (later)
# $xmlDoc->formatOutput = true;
echo $xmlDoc->saveXML();
РЕДАКТИРОВАТЬ: Приведенный выше фрагмент работает так, как и ожидалось. Я использовал функцию повторителя плагина, называемого Расширенными пользовательскими полями, и, поскольку он повторяет значения поля, в плагин пришлось добавить новую функцию, которая вместо повторяя значения, просто возвращает их:
function the_sub_field_return($field_name, $field = false)
{
$value = get_sub_field($field_name, $field);
if(is_array($value))
{
$value = implode(', ',$value);
}
return $value;
}
Если вам посчастливилось использовать тот же плагин для аналогичного проекта, не забудьте добавить вышеуказанную функцию в api.php файл, расположенный в каталоге плагина.