Hola @lorena24, y gracias por plantear una cuestión tan común.
@miguel_deco50 y @inmasevilla tienen razón. El error que experimentas se debe a que estás intentando invocar un método (getRelatedProductsByCategory) que no existe en la clase Product de PrestaShop. Un override de controlador debe llamar a métodos existentes o a métodos que tú misma hayas definido correctamente en un override de la clase Product.
Para obtener productos de una categoría y asignarlos a Smarty, la forma correcta en PrestaShop 1.7 sería utilizando el método getProducts de la clase Category. Puedes modificar tu override así:
// Fichero: override/controllers/front/ProductController.php
class ProductController extends ProductControllerCore
{
public function initContent()
{
parent::initContent();
if (Validate::isLoadedObject($this->product)) {
$id_category = (int)$this->product->id_category_default;
$category = new Category($id_category, $this->context->language->id);
if (Validate::isLoadedObject($category)) {
En este código, cargamos la categoría y luego usamos $category->getProducts() con el último parámetro en true para excluir el producto actual. Esto te dará productos de la misma categoría.
Sin embargo, esto es solo una parte de la funcionalidad 'Pro' que buscas. Los overrides son frágiles y pueden romperse con cada actualización del núcleo o de PHP (especialmente si pasas a PHP 8.x, donde hay muchos cambios). Para una solución completa y mantenible que ofrezca criterios avanzados (por ventas, por vistas, por atributos, etc.) sin tocar el core de PrestaShop, lo ideal es usar un módulo dedicado. Para una funcionalidad robusta de este tipo, te recomiendo echar un vistazo a esta herramienta de mypresta. Te ahorrará muchos dolores de cabeza a largo plazo.