10

I was trying to place a WordPress menu inside my template file. I found using wp_nav_menu uncomfortable since it outputs markup that is not compatible with my static HTML template. I know I could just use custom menu walker class to modify the markup that wp_nav_menu. But instead, I wanted to just use only the menu name and its corresponding url and place it in my template. For this, I used this function to get an array of all the attributes/properties of the menu.

Here is the code that was generated by this function...

I found it by using var_dump().

    Array
(
    [0] = WP_Post Object
        (
            [ID] = 20
            [post_author] = 1
            [post_date] = 2017-07-10 11:50:32
            [post_date_gmt] = 2017-07-10 10:50:32
            [post_content] = 
            [post_title] = About
            [post_excerpt] = 
            [post_status] = publish
            [comment_status] = closed
            [ping_status] = closed
            [post_password] = 
            [post_name] = about
            [to_ping] = 
            [pinged] = 
            [post_modified] = 2017-07-10 11:50:40
            [post_modified_gmt] = 2017-07-10 10:50:40
            [post_content_filtered] = 
            [post_parent] = 0
            [guid] = http://localhost/mySite/?p=20
            [menu_order] = 1
            [post_type] = nav_menu_item
            [post_mime_type] = 
            [comment_count] = 0
            [filter] = raw
            [db_id] = 20
            [menu_item_parent] = 0
            [object_id] = 20
            [object] = custom
            [type] = custom
            [type_label] = Custom Link
            [title] = About
            [url] = #
            [target] = 
            [attr_title] = 
            [description] = 
            [classes] = Array
                (
                    [0] = 
                )

            [xfn] = 
        )

    [1] = WP_Post Object
        (
            [ID] = 21
            [post_author] = 1
            [post_date] = 2017-07-10 11:50:32
            [post_date_gmt] = 2017-07-10 10:50:32
            [post_content] = 
            [post_title] = Things I Can Do
            [post_excerpt] = 
            [post_status] = publish
            [comment_status] = closed
            [ping_status] = closed
            [post_password] = 
            [post_name] = things-i-can-do
            [to_ping] = 
            [pinged] = 
            [post_modified] = 2017-07-10 11:50:40
            [post_modified_gmt] = 2017-07-10 10:50:40
            [post_content_filtered] = 
            [post_parent] = 0
            [guid] = http://localhost/mySite/?p=21
            [menu_order] = 2
            [post_type] = nav_menu_item
            [post_mime_type] = 
            [comment_count] = 0
            [filter] = raw
            [db_id] = 21
            [menu_item_parent] = 0
            [object_id] = 21
            [object] = custom
            [type] = custom
            [type_label] = Custom Link
            [title] = Things I Can Do
            [url] = #
            [target] = 
            [attr_title] = 
            [description] = 
            [classes] = Array
                (
                    [0] = 
                )

            [xfn] = 
        )

    [2] = WP_Post Object
        (
            [ID] = 22
            [post_author] = 1
            [post_date] = 2017-07-10 11:50:32
            [post_date_gmt] = 2017-07-10 10:50:32
            [post_content] = 
            [post_title] = A Few Accomplishments
            [post_excerpt] = 
            [post_status] = publish
            [comment_status] = closed
            [ping_status] = closed
            [post_password] = 
            [post_name] = a-few-accomplishments
            [to_ping] = 
            [pinged] = 
            [post_modified] = 2017-07-10 11:50:40
            [post_modified_gmt] = 2017-07-10 10:50:40
            [post_content_filtered] = 
            [post_parent] = 0
            [guid] = http://localhost/mySite/?p=22
            [menu_order] = 3
            [post_type] = nav_menu_item
            [post_mime_type] = 
            [comment_count] = 0
            [filter] = raw
            [db_id] = 22
            [menu_item_parent] = 0
            [object_id] = 22
            [object] = custom
            [type] = custom
            [type_label] = Custom Link
            [title] = A Few Accomplishments
            [url] = #
            [target] = 
            [attr_title] = 
            [description] = 
            [classes] = Array
                (
                    [0] = 
                )

            [xfn] = 
        )

    [3] = WP_Post Object
        (
            [ID] = 23
            [post_author] = 1
            [post_date] = 2017-07-10 11:50:32
            [post_date_gmt] = 2017-07-10 10:50:32
            [post_content] = 
            [post_title] = Contact
            [post_excerpt] = 
            [post_status] = publish
            [comment_status] = closed
            [ping_status] = closed
            [post_password] = 
            [post_name] = contact
            [to_ping] = 
            [pinged] = 
            [post_modified] = 2017-07-10 11:50:40
            [post_modified_gmt] = 2017-07-10 10:50:40
            [post_content_filtered] = 
            [post_parent] = 0
            [guid] = http://localhost/mySite/?p=23
            [menu_order] = 4
            [post_type] = nav_menu_item
            [post_mime_type] = 
            [comment_count] = 0
            [filter] = raw
            [db_id] = 23
            [menu_item_parent] = 0
            [object_id] = 23
            [object] = custom
            [type] = custom
            [type_label] = Custom Link
            [title] = Contact
            [url] = #
            [target] = 
            [attr_title] = 
            [description] = 
            [classes] = Array
                (
                    [0] = 
                )

            [xfn] = 
        )

)

My intention is to get the value of 'post_title' and 'url'

How can I do that?

I am currently struggling with these lines of code

function mt_get_menu_items($menu_name) {
if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
    $menu = wp_get_nav_menu_object( $locations[ $menu_name ] );
    return wp_get_nav_menu_items($menu->term_id);
}
}
$menu_items = mt_get_menu_items ('main_menu');
<nav id="nav">
<ul>
    <?php if (isset ($menu_items) ) : ?>
    <?php foreach ( (array) $menu_items as $key => $menu_item ) : ?>
    <?php // $menu_item_array = get_object_vars($menu_item[$key]);
                    $menu_object = $menu_item[$key];
                    // this line is 98
                 ?>
    <li>
         // this line is 101
        <a href="<?php $menu_object->url; ?>" class="active"><?php $menu_object->post_title; ?></a>
    </li>
    <?php endforeach; ?>
    <?php endif; ?>
</ul>
</nav>

This is generating this error:

Fatal error: Uncaught Error: Cannot use object of type WP_Post as array in D:\xampp\htdocs\mySite\wp-content\themes\mySite\header.php:98

13
  • Possible duplicate of 'Cannot use object of type stdClass as array' using Wordpress Commented Jul 10, 2017 at 17:42
  • 1
    It's an object. Use -> instead of []. Commented Jul 10, 2017 at 17:42
  • Also, it's probably not coming from post_title and url. Which line is 98? Commented Jul 10, 2017 at 17:43
  • With due respect, please read my code first. I am using -> when retrieving data out of object. But it just keeps giving me this error. Commented Jul 10, 2017 at 17:46
  • 1
    [CODE THAT SOLVED MY ISSUE] remove $menu_object = $menu_item[$key]; at line 98 altogether. Then at line 101.... use echo $menu_item->url; to echo out the menu url use echo $menu_item->post_title; to echo out the menu title Commented Jul 10, 2017 at 19:08

2 Answers 2

22

I'm going to post this answer here for reference...

Using a foreach loop

foreach ($originalArray as $key => $data) {
  $post_date = $data->post_date; // 2017-07-10 11:50:32
}

Because to access data inside an object, use ->.

Ex: $data['post_date'] to $data->post_date

Sign up to request clarification or add additional context in comments.

Comments

2

You're retrieving an object, you can convert it to an array as follows:

function object_to_array($obj) {
if(is_object($obj)) $obj = (array) $obj;
    if(is_array($obj)) {
        $new = array();
        foreach($obj as $key => $val) {
            $new[$key] = object_to_array($val);
        }
    }
    else $new = $obj;
    return $new;       
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.