Na forum WordPressa mateoo88 zapytał(a):
Potrzebuję tak przerobić kod odpowiedzialny za wyświetlanie wpisów aby wyświetlały mi się one np od 4 (aby 4 wpis był wyświetlany jako pierwszy a 1,2 i 3 wpis był ignorowany).
I moja pierwsza myśl była następująca:
add_filter( 'posts_request', 'a' );
function a( $query )
{
if ( is_home() ) {
if ( preg_match( '/LIMIT (\d+), (\d+)/', $query, $matches ) ) {
$offset = 3;
$target = sprintf(
'LIMIT %d, %d',
$matches[1] + $offset,
$matches[2] + $offset
);
$query = preg_replace( '/LIMIT \d+, \d+/', $target, $query );
}
}
return $query;
} |
add_filter( 'posts_request', 'a' );
function a( $query )
{
if ( is_home() ) {
if ( preg_match( '/LIMIT (\d+), (\d+)/', $query, $matches ) ) {
$offset = 3;
$target = sprintf(
'LIMIT %d, %d',
$matches[1] + $offset,
$matches[2] + $offset
);
$query = preg_replace( '/LIMIT \d+, \d+/', $target, $query );
}
}
return $query;
}
Co oczywiście zadziała, ale nie jest to rozwiązanie eleganckie i pół dnia męczyło mnie, że powinno się to zrobić inaczej, jakoś tak bardziej „poprawnie”.
Po przejrzeniu w codex dostępnych filtrów, uznałem że dużo lepsze jest skorzystanie z filtra pre_get_posts, co dało efekt w postaci takiego kodu:
add_filter( 'pre_get_posts', 'iworks_skip_3_posts' );
function iworks_skip_3_posts( $query )
{
if ( is_home() ) {
$query->set( 'offset', 3 );
}
return $query;
} |
add_filter( 'pre_get_posts', 'iworks_skip_3_posts' );
function iworks_skip_3_posts( $query )
{
if ( is_home() ) {
$query->set( 'offset', 3 );
}
return $query;
}
Moim zdaniem, takie rozwiązanie jest zdecydowanie bardziej eleganckie.
Standardowo kod do pobrania:
[zip href='http://iworks.pl/wp-content/uploads/2012/10/iworks-skip-3-posts.php-.zip']iworks_skip_3_posts.php.zip[/zip]
Jak użyć podany kod?
Masz 3 rozwiązania:
- wrzuć załączony plik do folderu
wp-content/plugins
, a potem włącz wtyczkę
- wrzuć załączony plik do folderu
wp-content/mu-plugins
- dołącz kod do pliku
functions.php
aktualnie używanego motywu