добавление отображения нет на основе статуса сообщения в меню ходунка

Я пытаюсь добавить отображение: нет в меню 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().

1

Решение

У тебя уже есть $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
1

Другие решения

Ты используешь 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 также.

1

По вопросам рекламы [email protected]