尝试使用许多嵌套循环和方法来构建此JavaScript块,我需要专家帮助。我遍历所有'menuitems',而menu_item_parent 0的那些是顶级父级,其余的我构建较低级别。
如何在这些循环中添加缺少的两个字符?
它缺少一个逗号
,
每次后
{'name' : '','url':'','subs':[
{'_id:':'1','title': '','img': ''}
,{'_id:':'1','title': '','img': ''}
]}
功能
function make_menu_object(){
$menu_name = 'sec_level';
$menu = wp_get_nav_menu_object( $menu_name );
$menuitems = wp_get_nav_menu_items( $menu->term_id, array( 'order' => 'DESC' ) );
$objpart=null;
$menuitems_count = count($menuitems);
$master_counter = 0;
foreach( $menuitems as $item ){
// get page id from using menu item object id
$id = get_post_meta( $item->ID, '_menu_item_object_id', true );
// set up a page object to retrieve page data
$page = get_page( $id );
$link = get_page_link( $id );
// item does not have a parent so menu_item_parent equals 0 (false)
if ( $item->menu_item_parent==0 ){
if($master_counter<>0){$objpart.=']},';}
$objpart .= <<<EOT
'$item->title' : {
'url':'',
'sections': [
EOT;
}else{
$counter=1;
$the_star=1;
$objpart .= <<<EOT
{'name' : '$item->title','url':'','subs': [
EOT;
$args = array( 'numberposts' => 4, 'offset'=> 0, 'post_type' => 'post', 'category' => $item->object_id);
$myposts = get_posts( $args );
$the_count = count($myposts);
foreach( $myposts as $post ) {//subs output into js object
setup_postdata($post);
$the_empty_thumbnail = '/wp-content/uploads/2013/03/holder_img_menu.jpg';
$the_thumbnail = get_the_post_thumbnail($post->ID, 'thumbnail');
//$the_thumbnail_img = (!empty($the_thumbnail) ? the_post_thumbnail() : $the_empty_thumbnail);
$the_post_title = addslashes($post->post_title);
$objpart .= <<<EOT
{'_id:':'1','title': '','img': ''}
EOT;
if($counter<$the_count){$objpart .= ',';}
$counter++;
}
if($the_star==1||$the_star==$counter){$objpart .=']}';}else{$objpart .=',';}
$the_star++;
}
$master_counter++;
}
$objpart .=']}';
return '<pre>'.$objpart.'</pre>';
}
当前输出
'Item 1' : {'url':'','sections': [
{'name' : '','url':'','subs':[
{'_id:':'1','title': '','img': ''}
,{'_id:':'1','title': '','img': ''}
]}
{'name' : '','url':'','subs': [
{'_id:':'1','title': '','img': ''}
,{'_id:':'1','title': '','img': ''}
,{'_id:':'1','title': '','img': ''}
,{'_id:':'1','title': '','img': ''}
]}
]},
'Item 2' : {
'url':'',
'sections': [
{'name' : '','url':'','subs': [
{'_id:':'1','title': '','img': ''}
]}]}
所需输出
'Item 1' : {'url':'','sections': [
{'name' : '','url':'','subs':[
{'_id:':'1','title': '','img': ''}
,{'_id:':'1','title': '','img': ''}
]}
,
{'name' : '','url':'','subs': [
{'_id:':'1','title': '','img': ''}
,{'_id:':'1','title': '','img': ''}
,{'_id:':'1','title': '','img': ''}
,{'_id:':'1','title': '','img': ''}
]}
]},
'Item 2' : {
'url':'',
'sections': [
{'name' : '','url':'','subs': [
{'_id:':'1','title': '','img': ''}
]}]}
答案 0 :(得分:1)
正如您对问题的评论所述,您应该在PHP中创建对象,然后使用json_encode。
同样如评论中所提到的,将代码重写为答案太复杂了。
但要指出正确的方向,一些伪代码来展示如何构建PHP对象:
function make_menu_object() {
$itemsForJS = new array(); // Initialize an empty array to hold the menu items
// Code to retrieve the menu items
// ...
$currTopLevelNode = null; // Because output from WP is flat list, state is needed
foreach ( $menuitems as $item ) {
// Code to retrieve data about the menu item
// ...
if ( $item->menu_item_parent==0 ) {
$currTopLevelNode = new stdClass; // Initialize an empty object
$currTopLevelNode->url = ''; // Or something more interesting...
$currTopLevelNode->sections = array(); // Empty holder for the sections to come
$itemsForJS[$item->title] = $currTopLevelNode;
} else {
$section = new stdClass;
$section->name = ''; // Or something more interesting
$section->url = ''; // Or maybe $item->url?
$section->subs = array(); // Empty array to hold data for the subs
// Code to retrieve post
// ...
foreach ($mypost as $post) {
$sub = new stdClass; // Empty object to hold data for the page
// Code to retrieve data about the post
// ...
$sub->id = '1'; // Or maybe $post->post_id?
$sub->title = ''; // Maybe $post->post_title?
$sub->url = ''; // Maybe $post->post_url?
$section->subs[] = $sub; // Adding the post to the section
}
$currTopLevelNode->sections[] = $section; // Adding the section to the item
}
}
return $itemsForJS; // This is an associative array, not string as in your code
}
使用此功能类似于:
$menuObject = make_menu_object();
echo '<pre>'.json_encode($menuObject).'</pre>';
当然,这是伪代码。例如,它假定收到的第一个$item
必须是顶级的 - 或$currTopLevelNode
将为null并且代码将崩溃。需要错误检查。
答案 1 :(得分:0)
if ( $item->menu_item_parent==0 ){
$objpart .= "]}";
}
在第二个if
之后添加