Die Verwendung eines Brauchs Walker
ist eigentlich gar nicht so schwer, es geht im Grunde so:
Erstellen Sie eine Klasse .
Eine Klasse ist eine Sammlung von Variablen und Funktionen, die mit diesen Variablen arbeiten.
Durch die Erweiterung eines anderen;
Die erweiterte oder abgeleitete Klasse enthält alle Variablen und Funktionen der Basisklasse [...] und was Sie in der erweiterten Definition hinzufügen.
So was:
class Extended_Class extends Base_Class {
// code
}
Dies gibt Ihnen die Möglichkeit, die Methoden oder Funktionen der erweiterten Basisklasse zu ändern / zu erweitern. Zusätzlich können / könnten Sie erweitern, indem Sie der erweiterten Klasse Methoden oder Variablen hinzufügen.
- Um die Möglichkeiten vollständig zu verstehen und zu nutzen, ist es notwendig, tiefer in die OOP: Klassen- und Objektaspekte von PHP einzusteigen. Aber das wäre hier zu viel und sowieso nicht der richtige Ort.
Kommen wir also zurück zu WordPress und wp_list_pages()
. Die Klasse, die wir erweitern möchten, um sie zu verwenden wp_list_pages()
, die Walker_Page
Klasse - Quelle - selbst, wurde durch Erweitern der Klasse Walker
- Quelle abgeleitet .
Nach dem oben erläuterten Schema werden wir dasselbe tun:
class Wpse159627_Walker_Page extends Walker_Page {
// code
}
Jetzt Walker_Page
hat zwei Variablen - $tree_type
und $db_fields
- und vier Methoden - start_lvl()
, end_lvl()
, start_el()
und end_el()
. Die Variablen werden uns nicht betreffen, in Bezug auf die Methoden , die wir zumindest haben einen genaueren Blick auf , start_el()
und end_el()
.
Das erste, was zu sehen ist, ist, dass diese beiden Methoden den Parameter haben $page
:
@param Objekt $ Seite Seitendatenobjekt.
Welches alle relevanten Daten enthält, die wir brauchen, wie das post_parent
, und so ziemlich ein WP_Post
/ $post
/ " $page
" Objekt ist. Durch die get_pages()
Rückgabe zurückgegeben
Ein Array, das alle Seiten enthält, die der Anforderung entsprechen, oder bei einem Fehler false. Das zurückgegebene Array ist ein Array von "Seiten" -Objekten.
innerhalb der wp_list_pages()
Funktion.
Was wir überprüfen müssen, ist der Post-Status der aktuellen übergeordneten Seite. Dazu steht die Funktion get_post_status()
zur Verfügung. Wie bestimmt können wir das dafür verfügbare $ page-Objekt verwenden.
$page_parent_id = $page->post_parent;
$page_parent_status = get_post_status( $page_parent_id );
Jetzt können wir dies verwenden, um den Status der übergeordneten Seite der Stromseite zu überprüfen:
if ( $page_parent_status != 'draft' ) {
// code
}
Implementieren wir es in unserer erweiterten Walker-Klasse:
class Wpse159627_Walker_Page extends Walker_Page {
function start_el( &$output, $page, $depth = 0, $args = array(), $current_page = 0 ) {
$page_parent_id = $page->post_parent;
$page_parent_status = get_post_status( $page_parent_id );
if ( $page_parent_status != 'draft' ) {
if ( $depth )
$indent = str_repeat("\t", $depth);
else
$indent = '';
extract($args, EXTR_SKIP);
$css_class = array('page_item', 'page-item-'.$page->ID);
if( isset( $args['pages_with_children'][ $page->ID ] ) )
$css_class[] = 'page_item_has_children';
if ( !empty($current_page) ) {
$_current_page = get_post( $current_page );
if ( in_array( $page->ID, $_current_page->ancestors ) )
$css_class[] = 'current_page_ancestor';
if ( $page->ID == $current_page )
$css_class[] = 'current_page_item';
elseif ( $_current_page && $page->ID == $_current_page->post_parent )
$css_class[] = 'current_page_parent';
} elseif ( $page->ID == get_option('page_for_posts') ) {
$css_class[] = 'current_page_parent';
}
$css_class = implode( ' ', apply_filters( 'page_css_class', $css_class, $page, $depth, $args, $current_page ) );
if ( '' === $page->post_title )
$page->post_title = sprintf( __( '#%d (no title)' ), $page->ID );
$output .= $indent . '<li class="' . $css_class . '"><a href="' . get_permalink($page->ID) . '">' . $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after . '</a>';
if ( !empty($show_date) ) {
if ( 'modified' == $show_date )
$time = $page->post_modified;
else
$time = $page->post_date;
$output .= " " . mysql2date($date_format, $time);
}
}
}
function end_el( &$output, $page, $depth = 0, $args = array() ) {
$page_parent_id = $page->post_parent;
$page_parent_status = get_post_status( $page_parent_id );
if ( $page_parent_status != 'draft' ) {
$output .= "</li>\n";
}
}
}
Die neue Klasse kann folgendermaßen verwendet werden wp_list_pages()
:
$args = array(
'sort_column' => 'menu_order',
'title_li' => '',
'post_status' => 'publish',
'walker' => new Wpse159627_Walker_Page
);
wp_list_pages( $args );
Bearbeiten:
Fügen Sie dies aus Gründen der Vollständigkeit hinzu, damit dies für Bäume funktioniert, für alle Nachkommen, nicht nur für Kinder. Es ist jedoch nicht der optimale Weg , es wurden genug andere Vorschläge gemacht.
Da WordPress get_ancestors()
und get_post_ancestors()
Funktionen nicht dazu gemacht sind, Entwürfe zu erhalten, habe ich eine Funktion erstellt, um jeden Vorfahren zu erhalten:
function wpse159627_get_all_post_ancestors( $post_id ) {
$post_type = get_post_type( $post_id );
$post = new WP_Query(
array(
'page_id' => $post_id,
'include' => $post_id,
'post_type' => $post_type,
'post_status' => 'any',
'cache_results' => false,
'update_post_meta_cache' => false,
'update_post_term_cache' => false
)
);
$post = $post->posts[0];
if (
! $post
|| empty( $post->post_parent )
|| $post->post_parent == $post->ID
) {
return array();
}
$ancestors = array();
$id = $ancestors[] = $post->post_parent;
while (
$ancestor = new WP_Query(
array(
'page_id' => $id,
'include' => $id,
'post_type' => $post_type,
'post_status' => 'any',
'cache_results' => false,
'update_post_meta_cache' => false,
'update_post_term_cache' => false
)
)
) {
$ancestor = $ancestor->posts[0];
if (
empty( $ancestor->post_parent )
|| ( $ancestor->post_parent == $post->ID )
|| in_array( $ancestor->post_parent, $ancestors )
) {
break;
}
$id = $ancestors[] = $ancestor->post_parent;
}
return $ancestors;
}
Zusätzlich ist es notwendig, den Status dieser Vorfahren zu erhalten. Was mit der folgenden Funktion gemacht werden kann:
function wpse159627_get_all_status( $ids ) {
$status_arr = array();
foreach ( $ids as $id ) {
$post_type = get_post_type( $id );
$post = new WP_Query(
array(
'page_id' => $id,
'include' => $id,
'post_type' => $post_type,
'post_status' => 'any',
'cache_results' => false,
'update_post_meta_cache' => false,
'update_post_term_cache' => false
)
);
$post = $post->posts[0];
$status_arr[] = $post->post_status;
}
return $status_arr;
}
Dies kann verwendet werden, um die oben erläuterte Bedingung zu ersetzen:
$ancestors = wpse159627_get_all_post_ancestors( $page->ID );
$ancestors_status = wpse159627_get_all_status( $ancestors );
if ( ! in_array( 'draft', $ancestors_status ) ) {
// code
}
exclude_tree
Parameter noch viel vereinfachen können , um die gesamten Entwurfszweige auszuschließen.