Sobrescrever modelo apenas em página específica

Vamos esclarecer isso primeiro.

Isso não está correto. Você não perde suas alterações ao atualizar se elas forem feitas em um tema. Elas persistem. A única maneira de perder suas alterações é se você editar diretamente os arquivos no seu servidor, o que, obviamente, você não deve fazer.

Agora, há certo risco envolvido ao sobrescrever modelos, pois uma atualização no núcleo pode significar que suas alterações não sejam mais compatíveis e precisem ser atualizadas. Se você estiver confortável com esse risco, tecnicamente pode alcançar o que está pedindo aqui.

Para começar, você precisa de uma maneira de distinguir quando o usuário está na página inicial. No caso do componente apenas categorias, uma maneira é verificar o searchContext. Quando você está em uma página de subcategoria, o contexto de pesquisa é definido como “category”. Se não houver contexto de pesquisa, significa que você está na página inicial.

A maneira de passar isso para seu modelo é adicionando algo como isso:

<script type="text/discourse-plugin"
        version="0.8">
  const categoriesOnlyComponent = require('discourse/components/categories-only').default;
  categoriesOnlyComponent.reopen({
    isHomepage: function() {
      return !this.parentView.searchService.contextType
    }.property()
  });
</script>

O que isso faz é permitir que você use isHomepage no modelo para categories-only. Ele retorna true se não houver contexto de pesquisa, o que significa que você está na página inicial. Caso contrário, retorna false.

Em seguida, você precisa copiar o modelo padrão da seguinte maneira:

<script type='text/x-handlebars'
        data-template-name='components/categories-only'>
  {{#if categories}}
  ... resto do modelo
  {{/if}}
</script>

e usar isHomepage que adicionamos. Para isso, você precisa usar o auxiliar {{#if}} do Handlebars. Basicamente, o que você precisa é de algo assim:

<script type='text/x-handlebars'
        data-template-name='components/categories-only'>
  {{#if categories}}
    {{#if isHomepage}}
      ... modelo apenas para a página inicial
    {{else}}
    ... resto do modelo padrão se não estiver na página inicial
  {{/if}}
</script>

Agora você pode usar o que quiser na seção isHomepage. Você pode editá-lo diretamente ali ou criar um novo modelo para essa seção, como mostrado abaixo:

<script type='text/x-handlebars'
        data-template-name='components/categories-only-homepage'>
  <h1>Você está na página inicial!</h1>
  <p>
    Use esta seção para renderizar o modelo para o componente apenas categorias se o usuário estiver na página inicial.
  </p>
</script>

A última coisa que você precisa fazer é chamar esse modelo como um parcial no modelo categories-only dentro da seção isHomepage, como mostrado abaixo:

<script type='text/x-handlebars'
        data-template-name='components/categories-only'>
  {{#if categories}}
    {{#if isHomepage}}
      {{partial 'components/categories-only-homepage'}}
    {{else}}
    ... resto do modelo padrão se não estiver na página inicial
  {{/if}}
</script>

O resultado é que, quando você visitar a página inicial, verá isso:

mas o componente nas subcategorias deve permanecer inalterado.

Isso é opcional, mas você também pode se interessar em ler:

porque essa é a nova maneira recomendada de trabalhar com temas e evitar o uso de tags script.