Я пытаюсь добавить отображение: нет в меню Walker в функциях, но он не работает.
В основном, если статус сообщения «черновик», то …
Есть идеи, где я ошибся?
if ( isset( $item->classes[0] ) && ! empty( $item->classes[0] ) ) {
$custom_class_data = ' data-classes="' . $item->classes[0] . '"';
}
$class_names = $class_names ? ' class="' . esc_attr( $class_names ) . $class_columns . '"' : '';
$style = $style ? ' style="' . esc_attr( $style ) . '"' : '';
$id = apply_filters( 'nav_menu_item_id', 'menu-item-' . $item->ID, $item, $args );
$id = $id ? ' id="' . esc_attr( $id ) . '"' : '';
global $post;
$page_id = $post->ID;; // example id of your page
$page = get_page( $page_id );
if( $page->post_status == 'draft' ) :
$output .= '<li role="menuitem" style="display: none"' . $id . ' ' . $class_names . ' ' . $column_width . $custom_class_data . $style . ' >';
else:
$output .= '<li role="menuitem" ' . $id . ' ' . $class_names . ' ' . $column_width . $custom_class_data . $style . ' >';
endif;
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
} // End if().
У тебя уже есть $style
переменная, которая хранит стили, я бы сделал что-то вроде этого:
// code...
if( $page->post_status == 'draft' ) {
$style = 'display: none;';
// if $style was previously initialized
// $style += 'display: none;';
}
$style = $style ? ' style="' . esc_attr( $style ) . '"' : '';
$output .= '<li role="menuitem"' . $id . ' ' . $class_names . ' ' . $column_width . $custom_class_data . $style . ' >';
// rest of the code
Ты используешь global $post
проверить статус, но это относится к текущей странице, поэтому она не будет работать должным образом.
Скрыть пункт меню в навигации
Я предполагаю, что это в start_el
функция и $item
Переданная переменная содержит информацию о странице / записи, которую нужно добавить в меню, поэтому вы можете проверить статус непосредственно следующим образом:
if( $item->post_status == 'draft' )
Ваш обновленный код будет:
if ( isset( $item->classes[0] ) && ! empty( $item->classes[0] ) ) {
$custom_class_data = ' data-classes="' . $item->classes[0] . '"';
}
$class_names = $class_names ? ' class="' . esc_attr( $class_names ) . $class_columns . '"' : '';
$style = $style ? ' style="' . esc_attr( $style ) . '"' : '';
$id = apply_filters( 'nav_menu_item_id', 'menu-item-' . $item->ID, $item, $args );
$id = $id ? ' id="' . esc_attr( $id ) . '"' : '';
if( $item->post_status == 'draft' ) :
$output .= '<li role="menuitem" style="display: none"' . $id . ' ' . $class_names . ' ' . $column_width . $custom_class_data . $style . ' >';
else:
$output .= '<li role="menuitem" ' . $id . ' ' . $class_names . ' ' . $column_width . $custom_class_data . $style . ' >';
endif;
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
Альтернатива: вообще не включать ссылку в навигацию
Поскольку они являются просто черновыми страницами, их вообще не следует включать — display:none
просто скрывает их от отображения, они все еще включены в HTML, поэтому URL можно легко увидеть, проверив HTML, и Google все равно будет пытаться перейти по ссылкам.
Я бы посоветовал проверить статус в первую очередь в вашей функции, и если его черновик, вернуть без каких-либо действий, в противном случае обработать элемент как обычно.
function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
// don't add page/post if it is draft
if( $item->post_status == 'draft' ) return;
// if its not draft, process as normal
[...]
}
Примечание: сообщения с другими статусами
Черновые сообщения обычно не включаются, поэтому я предполагаю, что вы используете собственный код для отображения сообщений / страниц. В этом случае не забывайте о постах со статусом future
, private
или же trash
также.