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