Хук для загрузки записи и страницы

16 окт. 2012 г., 09:24:04
Просмотры: 119K
Голосов: 31

Мне нужно выполнить функцию, когда загружается определенная запись или страница. Существует ли хук, который позволяет проверить, отображается ли запись во время загрузки страницы?

2
Комментарии

Публичная или административная часть?

kaiser kaiser
16 окт. 2012 г. 13:48:32

Для фронтенда. По сути, мне нужно, чтобы он срабатывал только при отображении определенного типа пользовательской записи.

Poulomi Nag Poulomi Nag
16 окт. 2012 г. 13:52:08
Все ответы на вопрос 3
3
35

Вы можете использовать хук wp и проверить объект global $wp_query или любое условное выражение.

add_action( 'wp', 'wpse69369_special_thingy' );
function wpse69369_special_thingy()
{
    if (
        'special_cpt' === get_post_type()
        AND is_singular()
    )
        return print "Привет, мир!";

    return printf(
        '<p>Здесь нечего смотреть! Проверьте объект!<br /></p><pre>%s</pre>',
        var_export( $GLOBALS['wp_query'], true )
    );
}

Смотрите: wp в codex.wordpress.org и wp в developer.wordpress.org

16 окт. 2012 г. 13:55:32
Комментарии

можете сказать, когда срабатывает хук 'wp'?

Poulomi Nag Poulomi Nag
16 окт. 2012 г. 14:07:32

A) Он срабатывает до after_setup_theme и setup_theme, поэтому доступен только для плагинов B) внутри WP :: main(), который вызывается из wp-settings.php.

kaiser kaiser
16 окт. 2012 г. 14:19:43

@kaiser Разве хук wp не срабатывает после хука after_setup_theme и прямо перед template_redirect, что делает wp доступным как для тем, так и для плагинов? (просто для уточнения?)

Adam Adam
17 окт. 2012 г. 09:18:06
4
25

Используйте template_redirect — это хук действия, который срабатывает перед рендерингом шаблона;

add_action('template_redirect', 'hooker');
function hooker(){
    //Я загружаюсь прямо перед выбором и отображением шаблона на экран
}
16 окт. 2012 г. 10:14:55
Комментарии

@PoulomiNag Без проблем, рад, что вы нашли ответ выше. Хотя я думаю, стоит отметить, что wp запускается после хука after_theme_setup, поэтому он доступен не только для плагинов, что делает его безопасным для использования в темах.

Adam Adam
17 окт. 2012 г. 09:21:38

Я только что проверил, и да; wp запускается после after_theme_setup. Но мне это нужно для моего плагина. Так что wp, как и template_redirect, оба отлично работают для меня. Жаль, что нельзя принять два ответа здесь! :)

Poulomi Nag Poulomi Nag
17 окт. 2012 г. 10:33:07

Все в порядке, не обязательно принимать оба, просто хотел уточнить порядок их выполнения. Убедиться, что я не схожу с ума, понимаете. Удачи с вашим плагином...

Adam Adam
17 окт. 2012 г. 10:42:41

+1 за каламбур в названии функции

MJHd MJHd
28 февр. 2020 г. 23:56:56
3

Я довольно часто использовал следующий подход для загрузки пользовательских метабоксов на страницах (а не в записях).

    add_action('admin_init','how_we_do_it_meta');

    function how_we_do_it_meta() {

        if ( $_SERVER['SCRIPT_NAME'] == '/wp-admin/post.php' ) {

            $post_id = $_GET['post'] ? $_GET['post'] : $_POST['post_ID'];
            $template_file = get_post_meta($post_id,'_wp_page_template',TRUE);

            if ($template_file == 'page-how-we-do-it.php') {

                add_meta_box('how_we_do_it_who-meta', 'С кем мы работаем...', 'how_we_do_it_who', 'page', 'normal', 'high');

                add_action('save_post', 'save_how_we_do_it_meta');

            }
        }
    }
16 окт. 2012 г. 10:02:09
Комментарии

Спасибо, Darronz. Но мне нужен хук, который будет работать на фронтенде во время загрузки страницы. Есть идеи?

Poulomi Nag Poulomi Nag
16 окт. 2012 г. 10:07:54

Если ты изменишь вышеуказанный код на add_action('init', // и т.д.), то он будет работать при загрузке страницы, а не только в админке.

darronz darronz
16 окт. 2012 г. 10:19:54

@darronz И затем внутри нужно проверить ! is_admin(), потому что хук init срабатывает с обеих сторон.

kaiser kaiser
16 окт. 2012 г. 14:20:17