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

17

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

Пуломи Наг
источник
публичная или административная сторона / облицовка?
Кайзер
Для переднего конца. По сути, я хочу, чтобы он срабатывал только тогда, когда отображается определенный отдельный тип записи.
Poulomi Nag

Ответы:

24

Вы можете использовать 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 "Yo World!";

    return printf(
        '<p>Nothing to see here! Check the object!<br /></p><pre>%s</pre>',
        var_export( $GLOBALS['wp_query'], true )
    );
}

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

кайзер
источник
подскажите, пожалуйста, когда запускается крючок wp?
Poulomi Nag
A) Он работает до after_setup_themeи setup_theme, поэтому он доступен только для плагинов B) внутри WP :: main(), который вызывается из wp-settings.php.
Кайзер
1
@kaiser Разве wpхук не срабатывает после after_setup_themeхука и прямо перед template_redirectтем, как сделать wpдоступным темы и плагины? (просто чтобы уточнить?)
Адам
13

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

add_action('template_redirect', 'hooker');
function hooker(){
    //I load just before selecting and rendering the template to screen
}
Адам
источник
@PoulomiNag Нет проблем, рад, что вы нашли свой ответ выше. Хотя я думаю, что одна небольшая заметка заключается в том, что она wpработает после after_theme_setupхука, поэтому она не просто доступна для плагинов, что делает ее безопасной для использования в темах.
Адам
Я только что проверил и да; wpбежит после after_theme_setup. Но мне нужно это для моего плагина. Так wpкак template_redirectи у меня оба отлично работают. Хотел бы я принять два ответа здесь! :)
Poulomi Nag
Это нормально, не нужно принимать оба, просто хотелось уточнить порядок, в котором они стреляют. Знаете, я не схожу с ума. Удачи с вашим плагином ...
Адам
1

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

    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', 'Who we work with...', 'how_we_do_it_who', 'page', 'normal', 'high');

                add_action('save_post', 'save_how_we_do_it_meta');

            }
        }
    }
darronz
источник
Спасибо Дарронз. Но мне нужен какой-то хук для работы на переднем конце во время загрузки страницы. Есть идеи?
Poulomi Nag
Если вы изменили вышеприведенное, to add_action('init', // etc)то это будет работать при загрузке страницы, а не только в разделе администратора.
Дарронз
2
@darronz И тогда вам нужно проверить ! is_admin()внутри, потому что initкрюк работает с обеих сторон.
Кайзер