# Customer Content Screen Hooks

https://dev.wisecp.com/es/client-content-screen-hooks

The twenty-seven placement points of the home page, content, the knowledge base and the sign-in forms.

## Overview

The placement points on the pages open to visitors live here: the home page, content and the blog, contact, the knowledge base and the sign-in forms.

Most of these pages are **open to everyone**. A script you place here is run by anyone not signed in, and anything depending on a session comes out empty.

## Reference

### After the home hero

uiclient.home.hero.after

`website/content` no parameters

Appears after the opening block of the home page.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.home.hero.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The end of the home sections

uiclient.home.sections.end

`website/content` no parameters

Appears at the end of the home page sections.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.home.sections.end', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The top of a content page

uiclient.content.top

`website/content` no parameters

Appears at the top of the content pages.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.content.top', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the page content

uiclient.content_page.content.after

`website/content` no parameters

Appears after the content of a plain page.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.content_page.content.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After a blog article

uiclient.blog_detail.content.after

`website/content` no parameters

Appears after the body of a blog article. It suits an author box or related posts.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.blog_detail.content.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the blog feed

uiclient.blog_list.feed.after

`website/content` no parameters

Appears after the blog list.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.blog_list.feed.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the news feed

uiclient.news_list.feed.after

`website/content` no parameters

Appears after the news list.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.news_list.feed.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the reference content

uiclient.reference_detail.content.after

`website/content` no parameters

Appears after the content of a reference page.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.reference_detail.content.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The top of the contact form

uiclient.contact.form.top

`website/content` no parameters

Appears above the contact form.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.contact.form.top', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The bottom of the contact form

uiclient.contact.form.bottom

`website/content` no parameters

Appears below the contact form. If you add a field, handling the submitted value is your job.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.contact.form.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The bottom of the contact sidebar

uiclient.contact.aside.bottom

`website/content` no parameters

Appears at the bottom of the side column on the contact page.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.contact.aside.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the domain search

uiclient.domain.search.after

`website/content` no parameters

Appears after the domain search box.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.domain.search.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The top of the knowledge base landing

uiclient.kb_landing.content.top

`website/knowledgebase` no parameters

Appears at the top of the knowledge base landing page.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.kb_landing.content.top', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The bottom of the knowledge base landing

uiclient.kb_landing.content.bottom

`website/knowledgebase` no parameters

Appears at the bottom of the landing page.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.kb_landing.content.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the search box

uiclient.kb_landing.search.after

`website/knowledgebase` no parameters

Appears after the knowledge base search box.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.kb_landing.search.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the category header

uiclient.kb_category.header.after

`website/knowledgebase` no parameters

Appears after the header of a category page.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.kb_category.header.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The bottom of the category content

uiclient.kb_category.content.bottom

`website/knowledgebase` no parameters

Appears at the bottom of the category page content.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.kb_category.content.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the table of contents

uiclient.kb_article.toc.after

`website/knowledgebase` no parameters

Appears after the table of contents of an article.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.kb_article.toc.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the article content

uiclient.kb_article.content.after

`website/knowledgebase` no parameters

Appears after the article body. It suits a feedback area or related articles.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.kb_article.content.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The article footer

uiclient.kb_article.footer

`website/knowledgebase` no parameters

Appears in the footer of an article.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.kb_article.footer', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The top of the knowledge base sidebar

uiclient.kb_sidebar.top

`website/knowledgebase` no parameters

Appears at the top of the knowledge base side column.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.kb_sidebar.top', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The bottom of the knowledge base sidebar

uiclient.kb_sidebar.bottom

`website/knowledgebase` no parameters

Appears at the bottom of the side column.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.kb_sidebar.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The bottom of the sign-in form

uiclient.login.form.bottom

`website/content` no parameters

Appears below the sign-in form. That page is **open to everyone**: a script placed here runs for anyone not signed in.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.login.form.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The bottom of the sign-up form

uiclient.register.form.bottom

`website/content` no parameters

Appears below the sign-up form. If you add an extra consent, **enforce it yourself**.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.register.form.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The bottom of the password recovery form

uiclient.auth.forget.form.bottom

`website/content` no parameters

Appears below the password recovery form.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.auth.forget.form.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The bottom of the password reset form

uiclient.auth.reset.form.bottom

`website/content` no parameters

Appears below the password reset form.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.auth.reset.form.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the invitation actions

uiclient.auth.invite.actions.after

`website/content` no parameters

Appears after the actions on the sub-user invitation page. The invited person **may hold no account yet**.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.auth.invite.actions.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

## Pitfalls

> **These pages are open to everyone**
> 
> Code you place on the sign-in, sign-up and content pages is run by anyone, **identified or not**. Keep internal details, keys and anything meant only for a customer out of them.

> **On the invitation page the other party may have no account**
> 
> The sub-user invitation page can open for somebody with **no record at all** in the system. Output depending on a session or an existing customer record comes out empty there.

## Related Articles

- [Customer Site Hooks](https://dev.wisecp.com/en/hooks-on-the-customer-site)
- [Customer Panel Data Hooks](https://dev.wisecp.com/en/client-panel-data-hooks)
- [Site Content Hooks](https://dev.wisecp.com/en/client-content-hooks)
