Reordenar elemento de submenú personalizado

3

En el menú Configuración , tengo los siguientes elementos de menú en la lista:

Settings
-- General
-- Writing
-- Reading
-- Discussion
-- Media
-- Permalinks
-- Blogging

Me gustaría que Blogging ( options-general.php?page=blogging ) reordenado debajo de General en lugar de estar en la parte inferior. Esto se agregó con la función add_options_page() .

Después de investigar un poco, esto es lo que he encontrado:

add_filter( 'custom_menu_order', array( $this, 'submenu_order' ) );
function submenu_order( $menu_order ) {
    global $submenu;
    $order = array();
    $order[] = $submenu['options-general.php'][10];
    $order[] = $submenu['options-general.php'][41];
    $submenu['options-general.php'] = $order;
    return $menu_order;
}

Esto funciona, pero solo muestra General y Blogging , el resto se eliminan:

Settings
-- General
-- Blogging

También, $submenu['options-general.php'][41] es actualmente la posición de índice 41 para mí. ¿Esto significa que será la misma posición de índice para todos los demás, incluso si tienen otra configuración de complemento en la lista?

    
pregunta Ethan Jinks O'Sullivan 19.09.2016 - 11:10

2 respuestas

5

Lo tengo, gracias a la ayuda de cjbj , pude obtener la solución final:

add_filter( 'custom_menu_order', 'submenu_order' );
function submenu_order( $menu_order ) {
    # Get submenu key location based on slug
    global $submenu;
    $settings = $submenu['options-general.php'];
    foreach ( $settings as $key => $details ) {
        if ( $details[2] == 'blogging' ) {
            $index = $key;
        }
    }
    # Set the 'Blogging' menu below 'General'
    $submenu['options-general.php'][11] = $submenu['options-general.php'][$index];
    unset( $submenu['options-general.php'][$index] );
    # Reorder the menu based on the keys in ascending order
    ksort( $submenu['options-general.php'] );
    # Return the new submenu order
    return $menu_order;
}
    
respondido por el Ethan Jinks O'Sullivan 19.09.2016 - 17:26
4

El resultado que obtienes no es sorprendente, dado que estás manipulando directamente una variable global. Reemplaza $submenu con solo los elementos con las claves 10 y 41. Si quieres seguir este método, deberías hacer esto (asumiendo que no hay nada en la clave 11):

$submenu['options-general.php'][11] = $submenu['options-general.php'][41];
unset ($submenu['options-general.php'][41]);

Sin embargo, tenga en cuenta que no está utilizando la función de filtro de ninguna manera. No le pasa nada al $menu_order que está pasando a través del filtro. Por lo tanto, esto no puede ser una solución muy limpia.

Como sin duda has visto, add_submenu_page simplemente agrega un nuevo submenú al final de la matriz En el orden en que se llama la función. Esta línea:

$submenu[$parent_slug][] = array ( $menu_title, $capability, $menu_slug, $page_title );

Entonces, si un nuevo complemento llamaría a add_submenu_page antes de que lo hagas, la clave de 41 podría ser fácilmente diferente. Para evitar esto, tendría que recorrer $submenu para encontrar la clave correcta. Versión rápida y sucia:

for ( $i = 1; $i <= 100; $i++ ) {
    if ( array_key_exists( $submenu['options-general.php'][$i] ) ) {
        if ( $submenu['options-general.php'][$i][2] == 'my-custom-slug' ) {
            $the_desired_key = $i;
            // [2] because that is the index of the slug in the submenu item array above
        }
    }
}

ACTUALIZAR

Mejor versión de este último bucle:

$sub = $submenu['options-general.php'];
foreach ( $sub as $key => $details ) {
        if ( $details[2] == 'my-custom-slug' ) {
            $the_desired_key = $key;
        }
  }

Después de encontrar $the_desired_key de esta manera, puedes usar de manera segura el método set + unset antedicho. He verificado que 11 es un desplazamiento no utilizado.

    
respondido por el cjbj 19.09.2016 - 12:25

Lea otras preguntas en las etiquetas