WordPress.org

Forums

Advanced Custom Fields: Nav Menu Field
[resolved] ACF 5 compatibility (14 posts)

  1. micahjm
    Member
    Posted 1 year ago #

    The ACF 5 beta is remarkably stable but I have not been able to get this plugin to work with it:

    https://github.com/AdvancedCustomFields/acf5-beta

    Is compatibility in the works? Thank you!

    https://wordpress.org/plugins/advanced-custom-fields-nav-menu-field/

  2. brandon.hcreativemedia
    Member
    Posted 1 year ago #

    I have ACF 5 loaded and this plugin is not working. Looking forward to seeing an update soon.

    Thanks!

  3. mangopeargroup
    Member
    Posted 1 year ago #

    I can also confirm this is an issue with ACF v5 PRO.

    An update in the next few days would be very appreciated.

    Thanks,

    Andi

  4. Jesse Graupmann
    Member
    Posted 11 months ago #

    I had this same problem last night so I attempted to create a ACF v5 PRO port. This worked for me but there is probably a better way -- *use at your own risk*

    Based on the Creating A New Field Type I needed 2 things to make this work. In (#1) fz-acf-nav-menu.php, register v5 support in via (#2) nav-menu-v5.php.

    #1
    Register v5 port in /plugins/advanced-custom-fields-nav-menu-field/fz-acf-nav-menu.php

    <?php
    /*
    Plugin Name: Advanced Custom Fields: Nav Menu Field
    Plugin URI: http://faisonz.com/wordpress-plugins/advanced-custom-fields-nav-menu-field/
    Description: Add-On plugin for Advanced Custom Fields (ACF) that adds a 'Nav Menu' Field type. <br>ACF v5 PRO port by <a href="http://www.justgooddesign.com">Jesse Graupmann</a>.
    Version: 1.1.2.5
    Author: Faison Zutavern + (ACF v5 PRO port by Jesse Graupmann)
    Author URI: http://faisonz.com | http://www.justgooddesign.com
    License: GPL2 or later
    */
    
    class acf_field_nav_menu_plugin
    {
    	function __construct()
    	{
    		// version 4+
    		add_action('acf/register_fields', array($this, 'register_fields'));	
    
    		// version 5+
    		add_action('acf/include_field_types', array($this, 'include_field_types'));
    	}
    
    	function register_fields()
    	{
    		include_once('nav-menu-v4.php');
    	}
    
    	function include_field_types()
    	{
    		include_once('nav-menu-v5.php');
    	}
    }
    new acf_field_nav_menu_plugin();

    #2
    Create the v5 file at /plugins/advanced-custom-fields-nav-menu-field/nav-menu-v5.php and use the following:

    <?php
    // ACF Pro v5 Port by Jesse Graupmann (http://justgooddesign.com)
    // Original from http://faisonz.com/wordpress-plugins/advanced-custom-fields-nav-menu-field/ by Faison Zutavern (http://faisonz.com)
    
    class acf_field_nav_menu_v5 extends acf_field
    {
    	var $settings, $defaults;
    	function __construct()
    	{
    		$this->name = 'nav_menu';
    		$this->label = __('Nav Menu', 'acf');
    		$this->category = __("Relational",'acf'); // Basic, Content, Choice, etc
    		$this->defaults = array(
    			'save_format' => 'id',
    			'allow_null' => 0,
    			'container' => 'div'
    		);
        	parent::__construct();
    		$this->settings = array(
    			'path' => apply_filters('acf/helpers/get_path', __FILE__),
    			'dir' => apply_filters('acf/helpers/get_dir', __FILE__),
    			'version' => '1.1.2'
    		);
    	} 
    
    	function render_field_settings( $field )
    	{
    		$field = array_merge($this->defaults, $field);
    		$key = $field['name']; 
    
    		// Create Field Options HTML
    		acf_render_field_setting( $field, array(
    			'label'			=> __('Return Value','acf'),
    			'type'		=>	'radio',
    			'name'		=>	'fields['.$key.'][save_format]',
    			'value'		=>	$field['save_format'],
    			'layout'	=>	'horizontal',
    			'choices' 	=>	array(
    				'object'	=>	__("Nav Menu Object",'acf'),
    				'menu'		=>	__("Nav Menu HTML",'acf'),
    				'id'		=>	__("Nav Menu ID",'acf')
    			)
    		));
    
    		$choices = $this->get_allowed_nav_container_tags();
    		acf_render_field_setting( $field, array(
    			'label'			=> __('Menu Container','acf'),
    			'instructions'	=> __('What to wrap the Menu\'s ul with.<br />Only used when returning HTML.','acf'),
    			'type'		=>	'select',
    			'name'		=>	'fields['.$key.'][container]',
    			'value'		=>	$field['container'],
    			'choices' 	=>	$choices
    		)); 
    
    		acf_render_field_setting( $field, array(
    			'label'			=> __('Allow Null?','acf'),
    			'type'	=>	'radio',
    			'name'	=>	'fields['.$key.'][allow_null]',
    			'value'	=>	$field['allow_null'],
    			'choices'	=>	array(
    				1	=>	__("Yes",'acf'),
    				0	=>	__("No",'acf'),
    			),
    			'layout'	=>	'horizontal',
    		));
    	}
    
    	function render_field( $field )
    	{
    		// create Field HTML
    		echo sprintf( '<select id="%d" class="%s" name="%s">', $field['id'], $field['class'], $field['name']  );
    
    		if( $field['allow_null'] )
    		{
    			echo '<option value=""> - Select - </option>';
    		}
    
    		// Nav Menus
    		$nav_menus = $this->get_nav_menus();
    
    		foreach( $nav_menus as $nav_menu_id => $nav_menu_name ) {
    			$selected = selected( $field['value'], $nav_menu_id );
    			echo sprintf( '<option value="%1$d" %3$s>%2$s</option>', $nav_menu_id, $nav_menu_name, $selected );
    		}
    
    		echo '</select>';
    	}
    
    	function get_nav_menus() {
    		$navs = get_terms('nav_menu', array( 'hide_empty' => false ) );
    
    		$nav_menus = array();
    		foreach( $navs as $nav ) {
    			$nav_menus[ $nav->term_id ] = $nav->name;
    		}
    
    		return $nav_menus;
    	}
    
    	function get_allowed_nav_container_tags() {
    		$tags = apply_filters( 'wp_nav_menu_container_allowedtags', array( 'div', 'nav' ) );
    		$formatted_tags = array(
    			array( '0' => 'None' )
    		);
    		foreach( $tags as $tag ) {
        		$formatted_tags[0][$tag] = ucfirst( $tag );
    		}
    		return $formatted_tags;
    	}
    
    	function format_value_for_api( $value, $post_id, $field )
    	{
    		$field = array_merge($this->defaults, $field);
    
    		if( !$value ) {
    			return false;
    		}
    
    		// check format
    		if( $field['save_format'] == 'object' ) {
    			$wp_menu_object = wp_get_nav_menu_object( $value );
    
    			if( !$wp_menu_object ) {
    				return false;
    			}
    
    			$menu_object = new stdClass;
    
    			$menu_object->ID = $wp_menu_object->term_id;
    			$menu_object->name = $wp_menu_object->name;
    			$menu_object->slug = $wp_menu_object->slug;
    			$menu_object->count = $wp_menu_object->count;
    
    			return $menu_object;
    
    		} elseif( $field['save_format'] == 'menu' ) {
    			ob_start();
    			wp_nav_menu( array(
    				'menu' => $value,
    				'container' => $field['container']
    			) );
    			return ob_get_clean();
    		}
    		return $value;
    	}
    }
    
    // create field
    new acf_field_nav_menu_v5();

    And that should be it.

    (Optional) I was able to get the values back out by using:

    <?php
    
    $post_id = 259; // your post id here
    $acf_field_id = 'sidebar_menu'; // your acf field id here
    
    $field = get_field($acf_field_id, $post_id);
    if($field){
    	$items = wp_get_nav_menu_items($field );
    	if($items){
    		// view menu as json
    		// echo json_encode($items);
    
    		// OR grab all the titles
    		$titles = array();
    		foreach($items as $key => $value){
    			$titles[] = $value ->title;
    		}
    		print_r($titles);
    	}
    }

    Hope this helps someone,
    Enjoy!

  5. Jesse Graupmann
    Member
    Posted 11 months ago #

    I can't seem to edit the post above so I'll supply a fix for #2 here. ACF had changed the way variables are stored and recalled. In addition, the function 'format_value_for_api' was changed to 'format_value'.

    #2 [FIXED]
    /plugins/advanced-custom-fields-nav-menu-field/nav-menu-v5.php

    <?php
    // ACF Pro v5 Port by Jesse Graupmann (http://justgooddesign.com)
    // Original from http://faisonz.com/wordpress-plugins/advanced-custom-fields-nav-menu-field/ by Faison Zutavern (http://faisonz.com)
    
    class acf_field_nav_menu_v5 extends acf_field
    {
    	var $settings,$defaults;
    	function __construct()
    	{
    		// vars
    		$this->name = 'nav_menu';
    		$this->label = __('Nav Menu', 'acf');
    		$this->category = __("Relational",'acf'); // Basic, Content, Choice, etc
    		$this->defaults = array(
    			'save_format' => 'id',
    			'allow_null' => 0,
    			'container' => 'div'
    		);
    
        	parent::__construct();
    
    		$this->settings = array(
    			'path' => apply_filters('acf/helpers/get_path', __FILE__),
    			'dir' => apply_filters('acf/helpers/get_dir', __FILE__),
    			'version' => '1.1.2'
    		);
    	} 
    
    	function render_field_settings( $field )
    	{
    		// Create Field Options HTML
    		acf_render_field_setting( $field, array(
    			'label'			=> __('Return Value','acf'),
    			'type'		=>	'radio',
    			'name'		=> 'save_format',
    			'layout'	=>	'horizontal',
    			'choices' 	=>	array(
    				'object'	=>	__("Nav Menu Object",'acf'),
    				'menu'		=>	__("Nav Menu HTML",'acf'),
    				'id'		=>	__("Nav Menu ID",'acf')
    			)
    		));
    
    		$choices = $this->get_allowed_nav_container_tags();
    		$usingMenu = $field['save_format'] === 'menu' ? '*' : '.';
    		acf_render_field_setting( $field, array(
    			'label'			=> __('Menu Container','acf'),
    			'instructions'	=> __('What to wrap the Menu\'s ul with.<br />Only used when returning HTML' . $usingMenu,'acf'),
    			'type'		=>	'select',
    			'name'		=> 'container',
    			'choices' 	=>	$choices
    		)); 
    
    		acf_render_field_setting( $field, array(
    			'label'			=> __('Allow Null?','acf'),
    			'type'	=>	'radio',
    			'name'		=> 'allow_null',
    			'choices'	=>	array(
    				1	=>	__("Yes",'acf'),
    				0	=>	__("No",'acf'),
    			),
    			'layout'	=>	'horizontal',
    		));
    	}
    
    	function render_field( $field )
    	{
    		// create Field HTML
    		echo sprintf( '<select id="%d" class="%s" name="%s">', $field['id'], $field['class'], $field['name']  );
    
    		if( $field['allow_null'] )
    		{
    			echo '<option value=""> - Select - </option>';
    		}
    
    		// Nav Menus
    		$nav_menus = $this->get_nav_menus();
    
    		foreach( $nav_menus as $nav_menu_id => $nav_menu_name ) {
    			$selected = selected( $field['value'], $nav_menu_id );
    			echo sprintf( '<option value="%1$d" %3$s>%2$s</option>', $nav_menu_id, $nav_menu_name, $selected );
    		}
    
    		echo '</select>';
    	}
    
    	function get_nav_menus() {
    		$navs = get_terms('nav_menu', array( 'hide_empty' => false ) );
    
    		$nav_menus = array();
    		foreach( $navs as $nav ) {
    			$nav_menus[ $nav->term_id ] = $nav->name;
    		}
    
    		return $nav_menus;
    	}
    
    	function get_allowed_nav_container_tags() {
    		$tags = apply_filters( 'wp_nav_menu_container_allowedtags', array( 'div', 'nav' ) );
    		$formatted_tags = array(
    			array( '0' => 'None' )
    		);
    		foreach( $tags as $tag ) {
        		$formatted_tags[0][$tag] = ucfirst( $tag );
    		}
    		return $formatted_tags;
    	}
    
    	function format_value( $value, $post_id, $field )
    	{
    		// defaults
    		$field = array_merge($this->defaults, $field);
    
    		if( !$value ) {
    			return false;
    		}
    
    		// check format
    		if( $field['save_format'] == 'object' ) {
    			$wp_menu_object = wp_get_nav_menu_object( $value );
    
    			if( !$wp_menu_object ) {
    				return false;
    			}
    
    			$menu_object = new stdClass;
    
    			$menu_object->ID = $wp_menu_object->term_id;
    			$menu_object->name = $wp_menu_object->name;
    			$menu_object->slug = $wp_menu_object->slug;
    			$menu_object->count = $wp_menu_object->count;
    
    			return $menu_object;
    
    		} elseif( $field['save_format'] == 'menu' ) {
    
    			ob_start();
    
    			wp_nav_menu( array(
    				'menu' => $value,
    				'container' => $field['container']
    			) );
    
    			return ob_get_clean();
    
    		}
    		return $value;
    	}
    }
    
    // create field
    new acf_field_nav_menu_v5();
  6. Dan Stramer
    Member
    Posted 10 months ago #

    Hi,
    I also am having issues and the plugin is not working with the acf 5 version.
    Will there be a plugin release to have it work with version 5?

    Much appreciated,

    Dan

  7. Jesse Graupmann
    Member
    Posted 10 months ago #

    I just went ahead and created a GitHub repo that includes the code above + the original plugin.

    https://github.com/jgraup/advanced-custom-fields-nav-menu-field

  8. Faison
    Member
    Plugin Author

    Posted 9 months ago #

    Hi Everyone,

    Sorry for my absence. I actually started work on adding ACF v5 support earlier this year, but then I got a job at 10up and had to put my plugins on hold while I settled in.

    Anyways, I'm settled in now and had the time tonight to put ACF Nav Menu Fields on Github. I started a 2.0.0 branch where I added support for ACF v5 (as well as cleaned up all my original code that made babies cry). If any of you are all still around, I was wondering if you could manually install the 2.0.0 branch and tell me if everything appears to be running smoothly? I just want to have a little bit of testing before pushing the changes live to wordpress.org.

    You can find the 2.0.0 branch here: https://github.com/Faison/ACF-Nav-Menu-Field/tree/2.0.0

  9. mangopeargroup
    Member
    Posted 9 months ago #

    Hi Faison,

    Thanks for the update, I'll try and get that installed later today on the site I had issues with.

    I'll let you know how it goes.

    Panda

  10. Faison
    Member
    Plugin Author

    Posted 9 months ago #

    Thanks, I look forward to hearing back from you :D

  11. frebro
    Member
    Posted 9 months ago #

    Faison: I installed the 2.0 branch and it seems to run flawlessly. Thanks! Do you have an ETA for when 2.0 i released here in the WordPress Plugin directory? I'd rather require it with Composer than just including the files in my repo.

  12. mangopeargroup
    Member
    Posted 9 months ago #

    We installed it on the website and it worked perfectly.

    Time to roll it out across all sites, along with ACF v5 :)

    Thanks,

    Andi

  13. Faison
    Member
    Plugin Author

    Posted 9 months ago #

    Hi frebro and Andi (mangopeargroup),

    Thank you for testing 2.0.0, It is now up-to-date on wp.org :)

    Thanks,
    Faison

  14. frebro
    Member
    Posted 9 months ago #

    Awesomepants. Stellar work with this plugin. Thanks man!

Topic Closed

This topic has been closed to new replies.

About this Plugin

  • Advanced Custom Fields: Nav Menu Field
  • Frequently Asked Questions
  • Support Threads
  • Reviews

About this Topic