在POST编辑屏幕上创建XML文件

时间:2011-09-08 作者:elbatron

好吧,这是个奇怪的问题,我知道。。

我对WP非常熟悉,所以我不想使用任何其他应用程序来生成XML(KML-编辑器注:这些是Google Earth文件)。

我想使用一个自定义的post类型,没有其他任何东西,只有一堆自定义字段和元框。我设置了XML模式(一个自定义的single.php):某些自定义字段值位于正确的XML标记之间,理论上,我有一个XML,可以使用WP创建、修改和删除。

问题是它仍然是一个php/html文件而不是xml,浏览器将其用作html/php文件,并尝试将其解释为html,即使xml在顶部声明。

是否有一个库或方法可以获取这些文件的html输出并以某种方式将其转换为XML?

谢谢

UPDATE 1: 这就是为什么我得到了一个placemark的名字(它给了你名字),但没有标签:

<?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; ?>
Update 2: 在教程的帮助下,我产生了以下代码:http://pastebin.com/zGJHm19t

但它不起作用。看起来我无法将字段值存储在变量中,并在页面上使用它们。你可能会认为这是因为我用于自定义字段的插件,但事实并非如此:如果我将$title = the_title() 然后我试着回应$title 我什么也得不到。

在第39-42行,最初的教程给出了这些值本身,XML漂亮地填充了这些值。这里的逻辑是,我将值存储在变量中,并在这里使用变量,但正如我所提到的,由于某些原因,我现在看不到,变量是空的。

1 个回复
最合适的回答,由SO网友:kaiser 整理而成

如果您使用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的内部架构,这方面的问题在于can\'t 发送多个同名元素。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提供的类。

<小时>EDIT: 看到粘贴后,下面是更正的版本。那里可能有打字错误。

<?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();
EDIT: 上述代码片段的工作原理与预期一样。我用的是repeater function 对于名为Advanced Custom Fields的插件,由于它回显字段的值,因此必须向插件添加一个新函数,该函数不回显值,只返回值:

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文件。

结束