如果您使用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文件。