1

尝试了许多嵌套循环和方法来构建这个 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': ''}
    ]}]}
4

2 回答 2

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 并且代码将崩溃。需要进行错误检查。

于 2013-08-06T07:13:24.473 回答
0
if ( $item->menu_item_parent==0 ){
    $objpart .= "]}";
}

在第二个 if 之后添加这个

于 2013-08-06T01:52:59.170 回答