Fellipe Sanches' website

Author: F. Sanches

  • Configuração para o NGINX

    Olá, hoje vamos ver aqui como confirgurar o servidor web Nginx, partindo de alguns conceitos básicos para o seu funcionamento, até sua configuração para produção.

    Neste exemplo vamos fazer a instalação do Nginx versão Open Source no Ubuntu Server (ver outras opções).

    Instalando o NGNIX

    No Linux:

    sudo apt-get update (para atualizar o repositório do Linux)
    
    sudo apt-get install nginx (para instalar o Ngnix)
    
    sudo nginx -v (para verificar a instalação)
    
    curl -I 127.0.0.1 (para verificar se o Ngnix está rodando e acessível na loopback)
    # Default server configuration
    
    #
    
    server {
    
            listen 80 default_server;
    
            listen [::]:80 default_server;
    
            # SSL configuration
    
            #
    
            # Note: You should disable gzip for SSL traffic.
    
            # See: https://bugs.debian.org/773332
    
            #
    
            # Read up on ssl_ciphers to ensure a secure configuration.
    
            # See: https://bugs.debian.org/765782
    
            #
    
            # Self signed certs generated by the ssl-cert package
    
            # Don't use them in a production server!
    
            #
    
            # include snippets/snakeoil.conf;
    
            listen 443 ssl default_server;
    
            listen [::]:443 ssl default_server;
    
            ssl_certificate /etc/ssl/mywebsite.com.crt;
    
            ssl_certificate_key /etc/ssl/mywebsite.com.key;
    
            root /var/www/company_website;
    
            # Add index.php to the list if you are using PHP
    
            index index.php index.html;
    
            server_name *.amazonaws.com;
    
            #redirects para inscricoes nos formularios de eventos do site antigo
    
            rewrite ^(/events/internal/.*) https://old.mywebsite.com$1 permanent;
    
            rewrite ^(/events/commercial/.*) https://old.mywebsite.com$1 permanent;
    
            rewrite ^(/specific/report-july/.*) https://old.mywebsite.com$1 permanent;
    
            location / {
    
                    # First attempt to serve request as file, then
    
                    # as directory, then fall back to displaying a 404.
    
                    try_files $uri $uri/ /index.php$is_args$args;
    
                    add_header Access-Control-Allow-Origin 'https://checkout.mywebsite.com';
    
            }
    
            # pass PHP scripts to FastCGI server
    
            #
    
            location ~ \.php$ {
    
                    include snippets/fastcgi-php.conf;
    
            #
    
            #       # With php-fpm (or other unix sockets):
    
                    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    
            #       # With php-cgi (or other tcp sockets):
    
            #       fastcgi_pass 127.0.0.1:9000;
    
            }
    
            # deny access to .htaccess files, if Apache's document root
    
            # concurs with nginx's one
    
            #
    
            location ~ /\.ht {
    
                    deny all;
    
            }
    
            location ~ ^/wp-admin {
    
                    allow 1.2.3.4; # INTERNAL LINK COMPANY
    
                    allow 2.3.4.5; # FELLIPE'S HOME OFFICE
    
                    deny all;
    
            }
    
            location ~ ^/wp-login.php {
    
                    allow 1.2.3.4; # INTERNAL LINK COMPANY
    
                    allow 2.3.4.5; # FELLIPE'S HOME OFFICE
    
                    deny all;
    
            }
    
            location ~ ^/login {
    
                    allow 1.2.3.4; # INTERNAL LINK COMPANY
    
                    allow 2.3.4.5; # FELLIPE'S HOME OFFICE
    
                    deny all;
    
            }
    
            location ~ /?author=([0-9]*) {
    
                    deny all;
    
            }
    
            location = /xmlrpc.php {
    
                    deny all;
                    
            }
    
    }
  • API customizada no WordPress

    Olá, hoje vamos ver aqui como construir uma API customizada no WordPresss, de forma simples e correta, evitando os erros mais comuns ao se fazer tal trabalho.

    Introdução com uma história triste

    Um vez fiz uma API customizada no WordPress para que meu frontend feito com DIVI Theme, para que ele pudesse ler os dados enviados por esta API, que por sua vez consultava diversos outros recursos externos, tais como outras APIs externas.

    Normalmente todos os temas WordPress têm um arquivo functions.php, no caso do DIVI o functions.php fica em /wp-content/themes/Divi/functions.php. Este arquivo é fundamental para adicionar funcionalidade personalizada ao tema, e foi lá que coloquei minhas customizações, acrescidas nas últimas linhas.

    O problema é que este arquivo é todo sobreescrito a cada nova versão lançada daquele tema pelo desenvolvedor do tema, apagando assim também qualquer customização feita por você ali. 

    Foi isso que aconteceu comigo, e a dica para que isso não ocorra contigo, eu vou deixar aqui neste artigo, que é colocar o seu código em um plugin personalizado, o que inclusive vai deixar a solucão mais segura e elegante!

    Mãos à massa

    Vamos começar criando um plugin personalizado. Para isso adicione um arquivo em: 

    /wp-content/plugins/custom-api/custom-api.php

    Você pode renomear o nome do diretório e arquivo para ficar de acordo com sua criação.

    Feito isso, insira este código no arquivo:

    <?php
    
    /*
    
    Plugin Name: Custom API Modifications
    
    Description: Custom APIs and endpoints
    
    Author: Name
    
    Version: 1.0
    
    */
    
    add_action('rest_api_init', function () {
    
        register_rest_route('minhaapi/v1', '/teste/', [
    
            'methods'  => 'GET',
    
            'callback' => 'minha_funcao_personalizada',
    
        ]);
    
    });
    
    function minha_funcao_personalizada() {
    
        return ['mensagem' => 'Funcionando!'];
    
    }

    Mais opções de valores para o header estão aqui

    Agora, quando você for a área de plugins do seu WordPress verá o seu plugin lá, ative-o, e faça uma chamada no browser para https://seusite.com/wp-json/minhaapi/v1/teste

    O retorno será: Funcionando!
    Pronto, você já tem um ponto em seu WordPress, pronto para se comunicar com o frontend e com recursos externos, de forma segura e organizada.
    Abaixo um exemplo completo de uma requisição usando o método POST, ele faz uma requisição a uma API externa, entregando os dados no backend do WordPress. Isso é útil para interligar o backend do seu WordPress a um serviço externo, e então ter os dados de retorno disponíveis para trabalhar no backend ou frontend do seu website.

    /*--------------------------------------
    
     Registra o endpoint consulta cliente 
    
    --------------------------------------*/
    
    function consulta_cliente(WP_REST_Request $request)
    
    {
    
      $api_url = 'https://api.exemplo.com';
    
      $required_params = ['valor', 'tipo'];
    
      // Verifica se algum parâmetro obrigatório está ausente
    
      foreach ($required_params as $param) {
    
        if (!isset($request[$param])) {
    
          return new WP_REST_Response([
    
            'message' => 'parâmetro [' . $param . '] não fornecido.'
    
          ], 400);
    
        }
    
      }
    
      $valor = $request->get_param('valor');
    
      $tipo = $request->get_param('tipo');
    
      // Faz a requisição para a API externa
    
      $response = wp_remote_post($api_url, [
    
        'headers' => [
    
          'Content-Type' => 'application/json',
    
        ],
    
        'sslverify' => false,
    
        'body' => json_encode([
    
          'valor' => $valor,
    
          'tipo' => $tipo
    
        ]),
    
      ]);
    
      if (is_wp_error($response)) {
    
        return new WP_REST_Response([
    
          'message' => 'Erro ao se conectar com a API externa.',
    
          'error' => $response->get_error_message(),
    
        ], 500);
    
      }
    
      $http_code = wp_remote_retrieve_response_code($response);
    
      $body = wp_remote_retrieve_body($response);
    
      $data = json_decode($body, true);
    
      return new WP_REST_Response($data, $http_code);
    
    }
    
    // Registra o endpoint na API REST
    
    add_action('rest_api_init', function () {
    
      register_rest_route('minhaapi/v1', '/cliente', [
    
        'methods' => 'POST',
    
        'callback' => 'consulta_cliente',
    
        'permission_callback' => '__return_true', // Permitir requisição sem autenticação
    
      ]);
    
    });
  • 6 dicas para te ajudar a programar no dia que estiver sem motivação

    1 – Compartilhar uma solução do trabalho com o mundo

    Compartilhar a solução de um problema do seu trabalho em algum fórum como o Stack Overflow, Dev.to, Quora ou fazer uma publicação em um blog pessoal, podem

    2 – Lembrar que você está ajudando as outras áreas da empresa e fazendo bem indiretamente ao trabalho de outros

    3 – Pensar que quanto mais cedo você terminar algo, mais cedo se verá livre daquilo, obtendo tempo assim para tarefas mais agradáveis

    4 – Usar a estratégia da Deliberate Practice Conceito popularizado por Anders Ericsson.
    Envolve praticar de forma intencional e focada em aspectos difíceis ou desconfortáveis para melhorar habilidades.
    A recompensa é pensar que enfrentar o que você não gosta ou onde tem mais dificuldade vai te ajudar no crescimento pessoal ou profissional

    5 – Ir além do básico monótono .

    fazer todo o básico complementando com algo que agregue valor e te agrade

    6 – Quebrar seu trabalho em partes para nao ver como ama enorme tarefa massante

  • PHP: três décadas impulsionando a web

    Em 8 de Junho de 2025, o PHP (Hypertext Preprocessor) completa 30 anos de existência, consolidando-se como uma das linguagens de programação mais influentes e duradouras da história.

    O PHP me proporcionou o primeiro cliente de desenvolvimento web ainda em 2010, uma imobiliária na cidade Maricá – RJ. Na época, como era constume, eu desenvolvi o projeto com ajuda de um livro do tipo que te guia a fazer um projeto completo, chamado “Faça um Site Orientado por Projeto Php 5. 2 Com Mysql 5. 0 – Carlos A. J. Oliviero”. Boas lembranças!

    Criado em 1995 por Rasmus Lerdorf, o PHP nasceu como um conjunto de scripts em C para suprir suas necessidades pessoais de programação. O que começou como uma ferramenta pessoal rapidamente evoluiu para uma linguagem de código aberto, usada por milhões de desenvolvedores ao redor do mundo.

    Durante esses últimos 30 anos o PHP passou por diversas melhorias, até avanços modernos como os do PHP 8.x, com suporte a tipagem estática, compilação JIT e recursos orientados a objetos mais sofisticados, a linguagem acompanhou — e em muitos casos, antecipou — as demandas da web moderna!

    Plataformas como WordPress (incluindo WooCommerce), Drupal, Joomla e Magento têm PHP como base até hoje, o PHP também conta com frameworks modernos e robustos como o Laravel e o Symfony, e isso tudo faz com que nada menos que 3/4 dos sites na internet atualmente utilizem PHP como linguagem de server-side, segundo estatísticas da W3Techs.

    Sem dúvida a longevidade do PHP é graças a sua comunidade fiel e ativa, sua documentação completa e organizada, e sua facilidade de aprendizado, o que fez dela a porta de entrada para milhares de desenvolvedores iniciantes.

    Com 30 anos de história, o PHP continua evoluindo, provando que sair na frente e manter uma base sólida, é o segredo para se manter na liderança. Parabéns ao PHP e a todos que contribuíram para sua jornada até aqui!

    <?php
    
    // Define emojis usando unicode
    $coracao = "\u{2764}\u{FE0F}";
    $cone = "\u{1F389}";
    
    echo "Parabéns pelos 30 anos proporcionados por\n todos que " . $coracao . " e usam o PHP! " . $cone\n;

    Resultado:

    Parabéns pelos 30 anos proporcionados por
    todos que ❤️ e usam o PHP! 🎉
  • How update from PHP 7.x to PHP 8.x at Ubuntu Linux

    Apt compatibility

    Another point to consider is that often an older PHP version, such as 7.4, is running on an older Ubuntu Linux distribution like 20.04. In this case, updates via apt to newer packages like those for PHP 8 will also be problematic. If possible, first update your Linux distribution to the latest LTS version.

    Code compatibility

    Upgrading from any version of PHP 7 to any version of PHP 8 is a major version jump and there is no single “self-update” command or “auto-update” button to do this, furthermore PHP 8 introduces breaking changes that could stop your old code from working, so we need be careful with this update.

    However, assuming all the risks of the code, we will perform the update using the apt package manager. Below let’s see the process to upgrade your system.

    The “Ondřej Surý” PPA

    Standard Ubuntu repositories usually lack the newest PHP versions, so you need use the standard third-party repository maintained by Ondřej Surý (a Debian PHP maintainer). To do it, type in shell:

    sudo apt update
    sudo apt install -y software-properties-common
    sudo add-apt-repository ppa:ondrej/php
    sudo apt update

    Get he extensions you had for PHP 7.x

    dpkg -l | grep php7 | cut -d ' ' -f 3
    Output:
    
    $ dpkg -l | grep php7 | cut -d ' ' -f 3
    php7.4-cli
    php7.4-common
    php7.4-mbstring
    php7.4-opcache
    php7.4-readline
    php7.4-xml

    Install PHP 8.x

    In a text editor, you can paste the output of the grep, and create your install command replacing what you need, like this:

    sudo apt install -y php8.4 php8.4-cli php8.4-common php8.4-mbstring php8.4-opcache php8.4-readline php8.4-xml

    Okay, now you have PHP 8 configured with the same packages as PHP 7.

  • Observer

    Auction and bidder, or news broadcast and viewer. These are examples of the observer design pattern. In each of these, relationships are generally one subject to many observers. One auction is observed by many bidders. One broadcast is observed by many viewers.

    As a behavioral pattern, it makes it easy to distribute and handle notifications of changes across systems, in a manageable and controlled way. 

    There are many different ways and situations you can apply the observer design pattern. 

  • What’s new in php 8

    Topic index on this page

  • Important changes in PHP 8

    Topic index on this page

    The way that automatic numbering works

    If you create an array with the first key as a negative number, subsequent keys will add 1 to the previous number. Prior to PHP 8, subsequent keys after a negative number always started from zero.

    <?php
    
    //php >= 8.x
      $myArray[-3] = 'R';
      array_push($myArray, 'T', 'Y');
      print_r($myArray);
    /*OUTPUT 
    Array
    (
        [-3] => R
        [-2] => T
        [-1] => Y
    )*/
    
    //php < 8.x
      $myArray[-3] = 'R';
      array_push($myArray, 'T', 'Y');
      print_r($myArray);
    /*OUTPUT 
    Array
    (
        [-3] => R
        [0] => T
        [1] => Y
    )
    )*/
    
    

    Comparison between numbers and strings

    PHP 8 changes the way the loose comparison operator == compares numbers to strings. Now it converting the number to a string and testing whether they’re the same.

    Before, the comparison was performed converting the string to a number, and it may seem bizarre, but previously any string compared no started in a numeral was converted to zero, what using the == operator would return true. Now all this sentenses (0 == “not-a-number”) are false:

    0 == "foo" is false

    0 == "" is false

    0 == "0" is true

    0 === "0" is false

    The words ´match´ and ´mixed´ are now reserved keywords