Jak wydzielić stronę z podstronami potomnymi w panelu administracyjnym?

Jak wydzielić stronę z podstronami potomnymi w panelu administracyjnym?

Jeżeli posiadasz w swojej witrynie na WordPressie dziesiątki, jak nie setki stron to doskonale wiesz jak utrudniona jest ich obsługa. W tym tekście dowiesz się w jaki sposób możesz to uporządkować.

Kiedy warto wydzielić strony z podstronami potomnymi w WordPressie?

Skorzystaj z tego rozwiązania, jeżeli:

  • Posiadasz dużo podstron w swojej witrynie i chciałbyś utworzyć dla siebie lub swoich klientów drogę „na skróty”,
  • Chciałeś dodać nowy typ wpisu do WordPressa, aby tylko wydzielić strony w panelu administracyjnym.

Gotowy kod do wykorzystania w Twojej witrynie

Jeżeli chcesz wykorzystać poniższy kod w swojej witrynie powinieneś dodać do pliku functions.php poniższe trzy funkcje.

Jedyne co powinno Cię interestować to funkcja lw_add_pages_to_admin_menu().

Możesz w niej dodać dowolną stronę w panelu administracyjnym, a dzięki kolejnym dwóm funkcjom dzięki dodaniu do adresu URL „post_parent={ID_STRONY} będziesz mógł bez problemu dodać dowolną stronę z podstronami potomnymi w WordPressie.

/**
 * 
 * Odc. 2. Jak wydzielić stronę z podstronami potomnymi w WordPressie?
 * 
 */

add_action( 'admin_menu', 'lw_add_pages_to_admin_menu' );
function lw_add_pages_to_admin_menu() {
    add_menu_page( 'Oferta', 'Oferta', 'edit_posts', 'edit.php?post_type=page&post_parent=43', '', 'dashicons-admin-page', 21 );

}

add_action( 'pre_get_posts', 'lw_admin_pre_get_posts' );
function lw_admin_pre_get_posts( $q ) {
    
    if ( isset( $_GET['post_parent'] ) ) {
        require_once(ABSPATH . 'wp-admin/includes/screen.php');
        $screen = is_admin() ? get_current_screen() : null;

        if ( $screen && 'edit-page' === $screen->id ) {
            $post_parent = (int) $_GET['post_parent'];

            $q->set( 'post_type', 'page' );   
            $q->set( 'post_parent', $post_parent );                
            $q->set( 'lw_include_parent', true );

        }

    }

}

add_filter( 'posts_where', function ( $where, \WP_Query $q ) use ( &$wpdb ) {
    if ( true !== $q->get( 'lw_include_parent' ) )
        return $where;

        $post_parent = filter_var( $q->get( 'post_parent' ), FILTER_VALIDATE_INT );
        if ( !$post_parent )
            return $where;

            $args = array(
                'fields' => 'ids',
                'post_type' => 'page',
                'post_parent' => $post_parent
            );
            $children_pages = get_posts($args);

            $subquery = "";

            $children_str = implode(",", $children_pages);

            if( $children_str ) {

                $results = $wpdb->get_results( "SELECT ID FROM $wpdb->posts WHERE $wpdb->posts.`post_parent` IN ($children_str) AND post_status IN ('publish', 'draft', 'pending')" );
                $subchildren_array = array();
    
                foreach( $results as $result ) {
                    $subchildren_array[] = $result->ID;
                } 
    
                $subchildren_str = implode(",", $subchildren_array);

                if( $subchildren_str ){
                    $subquery = "OR $wpdb->posts.ID IN ($subchildren_str)";

                }

            }

            
        
        $where .= " OR $wpdb->posts.ID = $post_parent $subquery";

        return $where;

    }, 10, 2 );

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *