Найкращий спосіб визначити, чи перебуваєте ви на сторінці ОДНОГО ПОШТУ


9

Тож це може здатися досить очевидним, але слідкуйте за мною тут.

Я намагаюся додати деяку логіку через pre_get_postsдію. Це весь об'єкт WP_Query, що дається мені. (див. кінець)

Речі, які я розглядав:

  • is_single() - занадто широкий.
  • is_singular()- зарано використовувати це, як get_queried_object()це ще не встановлено.
  • $query->single властивість - знову ж таки занадто широка.
  • $query->get('post_type')- не встановлено, оскільки використовується nameвластивість.

чи nameсправді єдиний показник тут?

WP_Query Object
(
    [query] => Array
        (
            [page] => 
            [name] => abcs-of-mental-health
        )

    [query_vars] => Array
        (
            [page] => 
            [name] => abcs-of-mental-health
            [error] => 
            [m] => 0
            [p] => 0
            [post_parent] => 
            [subpost] => 
            [subpost_id] => 
            [attachment] => 
            [attachment_id] => 0
            [static] => 
            [pagename] => 
            [page_id] => 0
            [second] => 
            [minute] => 
            [hour] => 
            [day] => 0
            [monthnum] => 0
            [year] => 0
            [w] => 0
            [category_name] => 
            [tag] => 
            [cat] => 
            [tag_id] => 
            [author_name] => 
            [feed] => 
            [tb] => 
            [paged] => 0
            [comments_popup] => 
            [meta_key] => 
            [meta_value] => 
            [preview] => 
            [s] => 
            [sentence] => 
            [fields] => 
            [menu_order] => 
            [category__in] => Array
                (
                )

            [category__not_in] => Array
                (
                )

            [category__and] => Array
                (
                )

            [post__in] => Array
                (
                )

            [post__not_in] => Array
                (
                )

            [tag__in] => Array
                (
                )

            [tag__not_in] => Array
                (
                )

            [tag__and] => Array
                (
                )

            [tag_slug__in] => Array
                (
                )

            [tag_slug__and] => Array
                (
                )

            [post_parent__in] => Array
                (
                )

            [post_parent__not_in] => Array
                (
                )

        )

    [tax_query] => 
    [meta_query] => 
    [queried_object] => 
    [queried_object_id] => 0
    [post_count] => 0
    [current_post] => -1
    [in_the_loop] => 
    [comment_count] => 0
    [current_comment] => -1
    [found_posts] => 0
    [max_num_pages] => 0
    [max_num_comment_pages] => 0
    [is_single] => 1
    [is_preview] => 
    [is_page] => 
    [is_archive] => 
    [is_date] => 
    [is_year] => 
    [is_month] => 
    [is_day] => 
    [is_time] => 
    [is_author] => 
    [is_category] => 
    [is_tag] => 
    [is_tax] => 
    [is_search] => 
    [is_feed] => 
    [is_comment_feed] => 
    [is_trackback] => 
    [is_home] => 
    [is_404] => 
    [is_comments_popup] => 
    [is_paged] => 
    [is_admin] => 
    [is_attachment] => 
    [is_singular] => 1
    [is_robots] => 
    [is_posts_page] => 
    [is_post_type_archive] => 
    [query_vars_hash] => f473ebf7f725c2627dc5fd9a1429f626
    [query_vars_changed] => 
    [thumbnails_cached] => 
)

Відповіді:


10

Я раніше намагався розібратися в своїх цілях. Наскільки я можу сказати ...

  • post_typeнасправді не встановлено ніде для postтипу публікації.
  • Для pageтипу публікації я бачу лише ключ типу повідомлення queried_object.
  • Для типів CPT є post_typeключ query_varsі в, і в query.
  • Морські меню, схоже, поводяться як інші CPT у цьому відношенні.

Дані дуже суперечливі, але якщо ви видалите сторінки та CPT, я вважаю, ви можете вважати postтип.

Редагувати: робочий код від @EricHolmes:

add_action( 'pre_get_posts', 'something_for_single_posts_only' ) ; 
function something_for_single_posts_only( $query ) { 
  if( $query->is_main_query() 
    && $query->is_singular() 
    && ! $query->get( 'post_type' ) 
    && ! $query->is_page() 
    && ! $query->is_attachment() 
  ) { 
      // do something for single posts only. 
  } 
} 

Ми перевіряємо is_singular, що не після типу (CPTS мати post_typeв query_vars), а НЕ сторінки або програми.


І він працює всередині pre_get_posts(перед запуском запиту)?
gmazzap

Цікаво, чи is_page()встановлено на pre_get_postsрівні. Якщо це так, і я можу переконатися, що він post_typeне встановлений у query_vars, я думаю, це так добре, як це отримується? Так зламаний.
Ерік Холмс

1
is_pageздається, встановлено.
s_ha_dum

@s_ha_dum я видалив коментар, оскільки він, здається, не працює для CPT ...
gmazzap

2
Додавання робочого рішення до вашої відповіді.
Ерік Холмс

0

Я не знаю, чи це буде корисно:

function hwl_home_pagesize( $query ) {
    global $wp_query;
    if (is_main_query() && count($wp_query->posts) < 2) {

    }

}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );

Використовуйте $ wp_query-> posts (масив), щоб перевірити тип публікації.


Ще ні. Попередньо отримуйте повідомлення відбувається до того, як $wp_query->postsзмінна буде фактично заселена. Дякую, хоча!
Ерік Холмс

0

Після деяких тестів я бачу, що, на жаль, неможливо отримати пост cpt всередині pre_get_postsгачка. is_pageТам можна отримати лише роботи, але не стандартний тип публікації, ані cpt.

Якщо у вас є тільки сторінка і пост (без CPT) чек на is_single()з trueяк засобом реагування на цей пост типу пост, тому що повертати брехня сторінок.

Якщо у вас також є CPT, я боюся, що вам доведеться виконати додатковий запит . Найпростіший, що я можу подумати, - це просто отримати post_typeстовпець, у якому публікується статус публікації, а ім'я post_name - потрібне (пропускаючи зміни):

function test( $q ) {
  if ( is_single() ) {
    global $wpdb;
    $type = $wpdb->get_var( $wpdb->prepare(
      "SELECT post_type FROM $wpdb->posts WHERE post_name = %s AND post_status = 'publish' AND post_type <> 'revision'",
      $q->query['name']
    ) );
    var_dump($type);
  }
}
add_action( 'pre_get_posts', 'test', 1); 

Якщо ви хочете перевірити певний тип публікації, ви можете написати спеціальний умовний тег, який просто підраховує рядки із заданим типом post_type та вказаним іменем:

function is_single_post_type( $type = 'post' ) {
  if ( is_single() ) {
    global $wpdb, $wp_query;
    $is = $wpdb->get_var( $wpdb->prepare(
      "SELECT count(ID) FROM $wpdb->posts WHERE post_name = %s AND post_status = 'publish' AND post_type = %s",
      $wp_query->query['name'], $type
    ) );
    return $is > 0;
  }
  return false;
}

Звичайно, це потрібно далі pre_get_post, у будь-якому наступному гачку ви можете використовувати get_post_type()...


1
Це безумовно спрацювало б, але подивіться у прийнятій відповіді, це набагато менш складний умовний режим, без додаткового запиту до бази даних. :)
Ерік Холмс

Так. Я розумію, що ви хотіли точно знати, який тип посади ви показуєте. Мало того, якщо ви перебуваєте в одному перегляді одного повідомлення @EricHolmes
gmazzap

-1

Це те, що я використовую, хоча воно спеціалізується на моїй власній структурі каталогів.

/**
 * Function to list all templates used in a page
 * @author Imperative Ideas with thanks to Rarst
 * @uri http://wordpress.stackexchange.com/a/89005
 */

function thelist() {
    $included_files = get_included_files();
    $stylesheet_dir = str_replace( '\\', '/', get_stylesheet_directory() );
    $template_dir   = str_replace( '\\', '/', get_template_directory() );
    echo '<h3 class="debugtitle">Theme file templates used in this page</h3>';
    foreach ( $included_files as $key => $path ) {

        $path   = str_replace( '\\', '/', $path );

        if ( false === strpos( $path, $stylesheet_dir ) && false === strpos( $path, $template_dir ) )
            unset( $included_files[$key] );

        if(!strpos($path, '/wp-content/themes/') === false) { // Files IN this directory
            if(strpos($path, '/library/') === false) { // Ignore this subdir
                if(strpos($path, '/hybrid-core/') === false) { // Ignore this subdir
                    echo $key." = ". $path."</br>"; // Finally, output the list
                }
            }
        }
    }
}

Пробіг може відрізнятися. Біти strpos, в яких я перевіряю, що файли знаходяться в одній директорії, а не в іншій, повинні бути змінені для вашої збірки і, ймовірно, можуть бути повторно враховані ефективніше. Вони існують для вирізання результатів над і під певною структурою каталогу.

Запустивши список () у нижньому колонтитулі, ви отримаєте нумерований список кожного файлу шаблону .php, який використовується для складання поточного перегляду. Це особливо корисно при роботі з дитячою темою, яка відображає таємничий компонент.


Здається, надмірність. Хоча крута ідея?
Ерік Холмс

Існує не так багато хороших способів визначити, які шаблони ведуть сторінку, окрім їх розбору. Я думаю, якщо ви шукаєте щось таке просте, як одиночний проти сторінки, так, це надмірно. Спробуйте запустити функцію деякий час, мінус додаткові умови ігнорування, і ви побачите, чому я використовую це. Є TON-файли, які переходять у створення WP-сторінки, і це може бути дуже корисно знати, що вони є. Навіть це не дозволить визначити зачеплені функції.
Імперативні ідеї
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.