Создание 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 были прекрасно ими заполнены. Логика здесь заключается в том, что я храню значения в переменных и использую здесь переменные, но, как я уже упоминал, по какой-то причине, которую я сейчас не вижу, переменные пусты.

Author: elbatron, 2011-09-08

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 файл, расположенный в каталоге плагина.

 1
Author: kaiser, 2011-09-09 16:23:31