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.
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] = ) )
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
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
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;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With