Ermittelt dynamisch den Metaschlüsselwert eines Menüelements basierend auf seiner Post-ID

Ich habe ein Menü, das ich ein Bild einfügen muss, dessen Pfad in einem _menu_item_img ( _menu_item_img ) _menu_item_img und mit einer Post-ID verknüpft ist, jeder Menüeintrag hat sein eigenes Bild, und ich muss es dynamisch greifen.

Der Ansatz, den ich versucht habe, und ich kann nichts bei Google finden, das mir helfen könnte.

wp_nav_menu( array( 'container' =>false, 'theme_location' => 'main_menu', 'menu_id' => 'main_menu', 'link_before' => get_post_meta($item->object_id, '_menu_item_img'))));

Dies ist die class, die ich zum Hinzufügen eines benutzerdefinierten Eintrags auf der Menüseite verwende:

 add_action( 'init', array( 'XTeam_Nav_Menu_Item_Custom_Fields', 'setup' ) ); class XTeam_Nav_Menu_Item_Custom_Fields { static $options = array( 'item_tpl' => ' 

', ); static function setup() { // @todo we can do some merging of provided options from WP options for from config self::$options['fields'] = array( 'color' => array( 'name' => 'img', 'label' => __('Link para Imagem', 'xteam'), 'container_class' => 'link-img', 'input_type' => 'text', ), ); add_filter( 'wp_edit_nav_menu_walker', function () { return 'XTeam_Walker_Nav_Menu_Edit'; }); add_filter( 'xteam_nav_menu_item_additional_fields', array( __CLASS__, '_add_fields' ), 10, 5 ); add_action( 'save_post', array( __CLASS__, '_save_post' ) ); } static function get_fields_schema() { $schema = array(); foreach(self::$options['fields'] as $name => $field) { if (empty($field['name'])) { $field['name'] = $name; } $schema[] = $field; } return $schema; } static function get_menu_item_postmeta_key($name) { return '_menu_item_' . $name; } /** * Inject the * @hook {action} save_post */ static function _add_fields($new_fields, $item_output, $item, $depth, $args) { $schema = self::get_fields_schema($item->ID); foreach($schema as $field) { $field['value'] = get_post_meta($item->ID, self::get_menu_item_postmeta_key($field['name']), true); $field['id'] = $item->ID; $new_fields .= str_replace( array_map(function($key){ return '{' . $key . '}'; }, array_keys($field)), array_values(array_map('esc_attr', $field)), self::$options['item_tpl'] ); } return $new_fields; } /** * Save the newly submitted fields * @hook {action} save_post */ static function _save_post($post_id) { if (get_post_type($post_id) !== 'nav_menu_item') { return; } $fields_schema = self::get_fields_schema($post_id); foreach($fields_schema as $field_schema) { $form_field_name = 'menu-item-' . $field_schema['name']; if (isset($_POST[$form_field_name][$post_id])) { $key = self::get_menu_item_postmeta_key($field_schema['name']); $value = stripslashes($_POST[$form_field_name][$post_id]); update_post_meta($post_id, $key, $value); } } } } require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; class XTeam_Walker_Nav_Menu_Edit extends Walker_Nav_Menu_Edit { function start_el(&$output, $item, $depth, $args) { $item_output = ''; parent::start_el($item_output, $item, $depth, $args); $new_fields = apply_filters( 'xteam_nav_menu_item_additional_fields', '', $item_output, $item, $depth, $args ); // Inject $new_fields before:

Kann mir jemand zeigen, wo ich den Punkt verpasse?

Solutions Collecting From Web of "Ermittelt dynamisch den Metaschlüsselwert eines Menüelements basierend auf seiner Post-ID"

Dieser Code:

 wp_nav_menu( array( 'container' =>false, 'theme_location' => 'main_menu', 'menu_id' => 'main_menu', 'link_before' => get_post_meta($item->object_id, '_menu_item_img')))); 

Lässt mich denken, dass das Problem am vorderen Ende ist, wenn Sie versuchen, die Werte anzuzeigen. Für Lesbarkeit (und ohne das Extra ) ):

 wp_nav_menu( array( 'container' =>false, 'theme_location' => 'main_menu', 'menu_id' => 'main_menu', 'link_before' => get_post_meta($item->object_id, '_menu_item_img') ) ); 

Im Wesentlichen ist das Problem reines PHP. Wenn Sie das Debugging aktiviert haben, werden Sie feststellen, dass in der Zeile, in der der Code ausgeführt wird, ein Notice angezeigt wird. Das liegt daran, dass $item zu diesem Zeitpunkt nicht definiert ist. $item ist definiert, da der Walker-Callback tatsächlich ausgeführt wird, aber PHP bemerkt Ihre Variable nicht und wartet bis später, um einen Sinn daraus zu machen. Es wird direkt dort verarbeitet, wenn es verwendet wird.

Sie müssen einen benutzerdefinierten Walker für das Frontend-Display erstellen (in etwa so ).

Ein Filter auf the_title könnte es auch tun:

 function pre_title_wpse_134186($title) { return 'test'.$title; } add_filter('the_title','pre_title_wpse_134186'); wp_nav_menu( array( 'container' =>false, 'theme_location' => 'main_menu', 'menu_id' => 'main_menu', ) ); remove_filter('the_title','pre_title_wpse_134186');