LARAVEL PHP
Criação de Controller no Laravel

Para criar um controller no laravel, utilize a seguinte sintaxe:

php artisan make:controller <nomecontroller>

Os controller serão criados na pasta:

.\app\Http\Controllers

Conforme o exemplo abaixo:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class welcomeController extends Controller
{
    //Metodo de visualização
    public function welcome(){
          return view('welcome');

    }
         
}            

É necessário criar o mesmo na rota (web.php):

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\WelcomeController;

Route::get('/', function () {
    $controller  = new welcomeController();
    return $controller->welcome();
});
     
PHP
Adicionando driver do SQL Server no PHP

Este procedimento prático, estou montando como referencia pessoal, porem podeee ser utilizado por outros.

Entre no site:

https://learn.microsoft.com/en-us/sql/connect/php/download-drivers-php-sql-server?view=sql-server-ver16

Baixe os arquivos do OPC do PHP:

https://go.microsoft.com/fwlink/?linkid=2246325

Copie para a pasta: C:\wamp64\bin\php\php8.0.26\ext , caso esteja usando wamp server. ou na pasta equivalente do seu php.

Entre no php.ini e copie o driver, conforme o script abaixo:

extension=php_pdo_sqlsrv_80_ts_x64.dll
extension=php_pdo_sqlsrv_80_nts_x64.dll  

O pulo do gato, é lembrar que o nro 80 é a versão do PHP.

Então para saber isso , crie um script e chame o phpinfo(); desta forma voce verá a versão do php.

Rode o programa, abaixo para saber se funcionou.

<?php
$serverName = "servidor";
//Testando a versao
//phpinfo();
$connectionOptions = "sqlsrv:Server=$serverName;Database=suabase";
//$connectionOptions
try {
    $conn = new PDO($connectionOptions);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (Exception $e)
{
    die(print_r($e->getMessage(), true));
}
?>    
Dicas wordpress
Wordpres – Plugins úteis

Segue alguns plugins bem úteis.

1 – File Upload Types

Permite escolher as extensões que voce pode baixar.

Fornecedor: https://wpforms.com/

2 – MathML block

Permite incluir formulas matemáticas no wordpres

Fornecedor: http://tunedin.net/

3 – weDocs

Permite disponibilizar documentação dentro do wordpres.

Fornecedor: https://wedocs.co/?utm_source=wporg&utm_medium=banner&utm_campaign=author-uri

4 – WooCommerce

Permite vender produtos ou serviços no wordpres

Fornecedor: https://woocommerce.com/

5 – View STL

Permite visualizar modelos de peças 3D, criados para impressoras 3D.

Fornecedor: https://falldeaf.com/

6 – Emb3D Model Viewer

Permite incluir modelos de peças 3D como visualização nos produtos vendidos no WooCommerce.

Fornecedor: https://www.netfarm.it/

7 – Desativar Comentários

Desativa os comentários que geralmente só atrapalham seus posts com um monte de propaganda inútil.

Fornecedor: https://wpdeveloper.com/

PHP
Web Service utilizando Verbos no PHP

Nesta longa jornada de aprendizado, mMais uma lição aprendida.

No exemplo a seguir, crio um web service, onde utilizo uma unica chamada para acionar todos os verbos do ws.


<?php
/*phpinfo();*/
/*Registra webservice para processamento de jobs*/
ini_set('display_errors', 'Off');
error_reporting(E_ALL);

include "connectdb.php";


function iif($cond, $arg_2, $arg_3)
{
    if($cond){
		return $arg_2;
	} else {
		return $arg_3;
	}
}

function filtro($cond){
	//$cond = str_replace('"',"'");
	return $cond;

}

$typereq = $_SERVER['REQUEST_METHOD'];
//echo $typereq;

if ($typereq==='POST')
{
	//echo "POST";
    // The request is using the POST method
	$data = json_decode(file_get_contents("php://input"));
	if($data){
		$localguid = $dbhandle->real_escape_string($data->guid);
		$idbperguntas = $dbhandle->real_escape_string($data->idbperguntas);
		//echo var_dump(json_decode($foo, true));
	} else {
		$localguid = $dbhandle->real_escape_string($_POST['guid']);
		$idbperguntas = $dbhandle->real_escape_string($_POST['idbperguntas']);
		//echo "3";
	}
	//echo $localguid;
	//echo $idbperguntas;
}

if ($typereq==='PUT')
{
	//echo "PUT";
    // The request is using the POST method
	$data = json_decode(file_get_contents("php://input"));
	if($data){
		$localguid = $dbhandle->real_escape_string($data->guid);
		$idhistorico = $dbhandle->real_escape_string($data->idhistorico);
		$pergunta = $dbhandle->real_escape_string($data->pergunta);
		//echo var_dump(json_decode($foo, true));
	} else {
		$localguid = $dbhandle->real_escape_string($_POST['guid']);
		$idhistorico = $dbhandle->real_escape_string($_POST['idhistorico']);
		$pergunta = $dbhandle->real_escape_string($_POST['pergunta']);
		//echo "3";
	}
	//echo $localguid;
	//echo $idhistorico;
	//echo $pergunta;
	if(($pergunta)&&($pergunta!=''))
	{
		$query = "insert into bperguntas (pergunta) values ('".$pergunta."');";
	}
	//echo $query;
	$rs = $dbhandle->query($query);
}

if ($typereq === 'GET') {
	//echo "GET";
    // The request is using the POST method
	$data = json_decode(file_get_contents("php://input"));
	if($data){
		$localguid = $dbhandle->real_escape_string($data->guid);
		$idbpergunta = $dbhandle->real_escape_string($data->idbpergunta);
	} else {
		$localguid = $dbhandle->real_escape_string($_GET['guid']);
		$idbpergunta = $dbhandle->real_escape_string($_GET['idbpergunta']);
	}
}

if ($typereq === 'DELETE')
{
	//echo $typereq;
	$data = json_decode(file_get_contents("php://input"));
	if($data){
		$localguid = $dbhandle->real_escape_string($data->guid);
		$idbperguntas = $dbhandle->real_escape_string($data->idbperguntas);
	} else {
		$localguid = $dbhandle->real_escape_string($_GET['guid']);
		$idbperguntas = $dbhandle->real_escape_string($_GET['idbperguntas']);
	}
	if ($idbperguntas)
	{
		//$localguid = $data->guid;
		//$idbpergunta = $data->idbpergunta;
		$query = "delete from bperguntas where idbperguntas = ".$idbperguntas.';';
		if($dbhandle->query($query)==TRUE)
		{
			echo ($query);
			$strJSON =  '{"rs":[';
			$strJSON = $strJSON . '{';
			$strJSON = $strJSON . '"IDPergutas":'.$idbperguntas.',';
			$strJSON = $strJSON . '"resposta":"Registro excluido com sucesso!"';
			$strJSON = $strJSON . '}';
			$strJSON = $strJSON . ']}';
			echo($strJSON);
		}
		else
		{
			$strJSON =  '{"rs":[';
			$strJSON = $strJSON . '{';
			$strJSON = $strJSON . '"IDPergutas":'.$idbperguntas.',';
			$strJSON = $strJSON . '"resposta":"'.$dbhandle->error.'"';
			$strJSON = $strJSON . '}';
			$strJSON = $strJSON . ']}';
			echo($strJSON);

		}
	}
	else
	{
		$strJSON =  '{"rs":[';
	    $strJSON = $strJSON . '{';
		$strJSON = $strJSON . '"IDPergutas":'.$idbperguntas.',';
		$strJSON = $strJSON . '"resposta":"Registro não encontrado!"';
		$strJSON = $strJSON . '}';
		$strJSON = $strJSON . ']}';
		echo($strJSON);
	}
}

if($localguid!=GUID)
{
	//echo $localguid;
	//echo "  - - ";
	//echo GUID;
	$strJSON =  '{';
	$strJSON = $strJSON . '"mensagem":"Acesso negado"';
	$strJSON = $strJSON . '}';
	echo $strJSON;
	exit();
}


if (($typereq === 'GET')){
	if(($idbperguntas)&&($idbperguntas!='0'))
	{
		$query = "select idbperguntas, pergunta from bperguntas where (idbpergunta = ".$idbperguntas.");";
	} else {
		$query = "select idbperguntas, pergunta from bperguntas ;";
	}
	$rs = $dbhandle->query($query);

	$cont = 0;
	//echo $query;
	$strJSON =  '{"rs":[';
	//while($row=$rs->fetch_assoc())
	while($row=$rs->fetch_assoc())
	{

		if($cont!=0)
		{
			$strJSON = $strJSON . ',';
		}
		$strJSON = $strJSON . '{';
		$strJSON = $strJSON . '"idbperguntas":'.filtro(iif(($row['idbperguntas']!=''),$row['idbperguntas'],'[vazio]')).',';
		$strJSON = $strJSON . '"pergunta":"'.filtro(iif($row['pergunta']!='',$row['pergunta'],'[vazio]')).'"';
		$strJSON = $strJSON . '}';
		$cont ++;
	}
	$strJSON = $strJSON . ']}';
	if ($cont>0)
	{
		echo($strJSON);
	}
}
?>



Na chamada REQUEST_METHOD, captura qual o verbo do html associado a aquela requisição.

$typereq = $_SERVER[‘REQUEST_METHOD’];

Desta forma podemos criar ações especificas para determinados verbos.

if (($typereq === ‘GET’)||($typereq === ‘POST’)){

IA PHP pós graduação Python
Chatbot no wordpress – Parte 2b

Neste fragmento criamos uma série de mudanças no plugin do wordpress para centralizar as operações do chatbot.

Git do projeto

https://github.com/marcelomaurin/chatbot-wordpress

Fiz esta modificação para facilitar a gestão dos itens.

Mudanças envolvidas

No plugin foram feitas diversas mudanças, entre elas. Criação de um menu de itens.

Plugin do wordpress

Temos um menu onde temos opções de Teste de funcionalidade do chatbot

Exemplo do chatbot

E o histórico, que mostra as perguntas realizadas, com opção de exclusão de lixo.

Histórico de Pesquisa

O projeto agregou um web service, que permite comunicação com o banco de dados, conforme o projeto historico.php.


<?php
/*phpinfo();*/
/*Registra webservice para processamento de jobs*/
ini_set('display_errors', 'Off');
error_reporting(E_ALL);

include "connectdb.php";

$typereq = $_SERVER['REQUEST_METHOD'];
//echo $typereq;

if ($typereq==='POST')
{
	//echo "POST";
    // The request is using the POST method
	$data = json_decode(file_get_contents("php://input"));
	if($data){
		$localguid = $dbhandle->real_escape_string($data->guid);
		$idhistorico = $dbhandle->real_escape_string($data->idhistorico);
		//echo var_dump(json_decode($foo, true));
	} else {
		$localguid = $dbhandle->real_escape_string($_POST['guid']);
		$idhistorico = $dbhandle->real_escape_string($_POST['idhistorico']);
		//echo "3";
	}
	//echo $localguid;
	//echo $idhistorico;
}

if ($typereq === 'GET') {
	//echo "GET";
    // The request is using the POST method
	$data = json_decode(file_get_contents("php://input"));
	if($data){
		$localguid = $dbhandle->real_escape_string($data->guid);
		$idhistorico = $dbhandle->real_escape_string($data->idhistorico);
	} else {
		$localguid = $dbhandle->real_escape_string($_GET['guid']);
		$idhistorico = $dbhandle->real_escape_string($_GET['idhistorico']);
	}
}

if ($typereq === 'DELETE')
{
	//echo $typereq;
	$data = json_decode(file_get_contents("php://input"));
	if($data){
		$localguid = $dbhandle->real_escape_string($data->guid);
		$idhistorico = $dbhandle->real_escape_string($data->idhistorico);
	} else {
		$localguid = $dbhandle->real_escape_string($_GET['guid']);
		$idhistorico = $dbhandle->real_escape_string($_GET['idhistorico']);
	}
	//$localguid = $data->guid;
	//$idhistorico = $data->idhistorico;
	$query = "delete from historico where idhistorico = ".$idhistorico;
	$dbhandle->query($query);
	//echo ($query);
}

if($localguid!=GUID)
{
	//echo $localguid;
	//echo "  - - ";
	//echo GUID;
	$strJSON =  '{';
	$strJSON = $strJSON . '"mensagem":"Acesso negado"';
	$strJSON = $strJSON . '}';
	echo $strJSON;
	exit();
}


if (($typereq === 'GET')||($typereq === 'POST')){
	if(($idhistorico)&&($idhistorico!='0'))
	{
		$query = "select idhistorico, pergunta from historico where (idhistorico = ".$idhistorico.");";
	} else {
		$query = "select idhistorico, pergunta from historico ;";
	}
	$rs = $dbhandle->query($query);

	$cont = 0;
	//echo $query;
	$strJSON =  '{"rs":[';
	//while($row=$rs->fetch_assoc())
	while($row=$rs->fetch_assoc())
	{

		if($cont!=0)
		{
			$strJSON = $strJSON . ',';
		}
		$strJSON = $strJSON . '{';
		$strJSON = $strJSON . '"idhistorico":'.$row['idhistorico'].',';
		$strJSON = $strJSON . '"pergunta":"'.$row['pergunta'].'"';
		$strJSON = $strJSON . '}';
		$cont ++;
	}
	$strJSON = $strJSON . ']}';
	if ($cont>0)
	{
		echo($strJSON);
	}
}
?>

No código acima, vemos que os verbos do HTML estão contemplados, apesar do sistema apenas usar o POST e DELETE.

O uso destes verbos será modelo para outros web services mais complexos.

Outra melhoria foi o uso de um GUID, que irá aumentar a segurança, restringindo o acesso ao web service, apenas a requisições com a chave correta.

Muitas mudanças ainda serão necessárias, porem estas garantem que nosso chatbot seja mais prático.

Muitas pessoas sabem que um chatbot não precisa deste tipo de melhoria, mas de fato, quando a intensão é o aprendizado, faze-lo de forma que fique mais fácil gerenciar as diversas ações de gestão do chatbot, ajudarão em um futuro próximo.

Há muito o que fazer, espero que acompanhem essa jornada.

Abraço.

IA PHP Python wordpress
Chatbot no wordpress – Parte 2

Agora que criei a página do Chatbot, vou comecar a preparar o recheio.

Definindo objetivo do Chatbot

A primeira coisa que precisamos saber é sobre o que devemos realizar nosso chatbot.

Bom irei falar sobre os projetos da maurinsoft.

Então o primeiro trabalho que irei precisar é criar simulados de perguntas, para facilitar isso, irei criar um conjunto de aplicações.

Neste post irei falar sobre o primeiro.

A melhor forma de criar um conjunto de perguntas é perguntando.

Então vou adicionar ao meu projeto uma tabela historico.

historico.sql

use maurinsoftdb;

create table historico (
  idhistorico int AUTO_INCREMENT PRIMARY KEY,
  pergunta varchar(200) not null,
  ip varchar(40),
  dtquest TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Agora que criei o espaço de armazenamento no banco, irei incluir no web service que processa a pergunta.

Fonte: runpy.php

<?php
    /*phpinfo();*/
	/*Registra webservice para processamento de jobs*/
	ini_set('display_errors', 'ON');
	error_reporting(E_ALL);

	header('Content-Type: application/json');  // <-- header declaration

	include "/var/www/html/python/connectdb.php";

	//header('Cache-Control: no-cache, must-revalidate');

$data = json_decode(file_get_contents("php://input"));

if($data){
		$pergunta = $dbhandle->real_escape_string($data->pergunta);
} else {
		$pergunta = $dbhandle->real_escape_string($_GET['pergunta']);
}

$ip = $_SERVER['REMOTE_ADDR']; /*Pega o ip do cliente*/

//echo "Inseriu";
$query= "INSERT into historico (pergunta, ip) values ( '". $pergunta. "', '".$ip."')";
$dbhandle->query($query); /*Executa*/

$json =  '{"rs":[';
if($pergunta){
  $command = escapeshellcmd('/var/www/html/python/nlp.py "'.$pergunta.'" > /var/log/proclog.log');
  $resposta = shell_exec($command);
  $resposta = str_replace (array("\r\n", "\n", "\r"), ' ', $resposta);

  if($resposta){
     $json = $json  . '{';
     $json = $json  .  '"pergunta":"'.$pergunta.'",';
     $json = $json  .  '"resposta":'.$resposta;
     $json = $json  .  '}';
  } else {
	 $json = $json  . '{';
	 $json = $json  .  '"pergunta":"'.$pergunta.'",';
     $json = $json  .  '"resposta":"'.'sem resposta'.'"';
	 $json = $json  .  '}';
  }
} else {
	$json = $json  . '{';
	$json = $json  .  '"pergunta":"'.$pergunta.'",';
    $json = $json  .  '"resposta":"'.'sem resposta'.'"';
	$json = $json  .  '}';
}
$json = $json  .  ']}';

echo $json
?>

Neste projeto que não irei falar muito, pois ja comentei sobre a maior parte em posts anteriores, fiz a inserção do código abaixo:

//echo "Inseriu";
$query= "INSERT into historico (pergunta, ip) values ( '". $pergunta. "', '".$ip."')";
$dbhandle->query($query); /*Executa*/	

Nela ao receber a pergunta armazenamos ela p pesquisa histórica.

Próximos passos

A seguir os próximos passos que iremos postar.

  • Iremos montar as questões que serão respondidas
  • Iremos cadastrar as respostas possíveis
  • Iremos associar as perguntas as respostas
  • Iremos gerar treinamento da nossa rede
  • Iremos codificar nosso código em python.
wordpress
Chatbot no wordpress

Chat - Manager

Chat bot online
Teste de Chatbot
Tutorial de CSS

{{app}}

{{msg}}

Objetivo

Neste tópico incluiremos o chatbot no wordpress, atraves de um shortcode.

Projeto GIT

O código deste projeto pode ser visto no git abaixo:

https://github.com/marcelomaurin/chatbot-wordpress

Ele permite criar um shortcode, que pode ser incluido nos posts.

Onde aparece uma pagina de chat, para que possa interagir.

[chatbot]

O chatbot pode ser incluído na página conforme o link acima.

O chatbot ja incluído nesta página

Nos próximos artigos iremos dar inicio ao código do chatbot, pois este esta apenas com a parte web atualmente.

wordpress
Personalização do WordPress

Os templates tags são informações obtidas do wordpress, que facilitam a captura das informações pelo site.

A lista de templates é muito variada, e pode ser vista no site:

https://codex.wordpress.org/Template_Tags

Mas podemos destacar alguns:

  • the_tags – lista de tags marcados no post.
  • the_category – lista de categorias marcadas no post.

Rodando Querys

É possível rodar uma query incorporada, lendo informações do banco do wordpress, conforme exemplo:

global $wpdb;

$sql = "select * from $wpdb->posts where post_status = 'publish'");

$listagem = $wpdb->get_results($sql);

foreach ($listagem as $value){
    echo $value->post_title;
    echo $value->post_content;
}

Usando WP_QUERY

O WP_QUERY é um query modificado, permitindo fazer filtragens por parâmetros.

$posts = new WP_Query('posts_per_page=1&orderby=rand');

while($posts->have_posts()): $posts->the_post();
    echo the_title();
    echo the_content();
endwhile;

Estarei dando maior foco no WP_Query em outros posts.

Tornar um WORDPRESS restrito

Uma forma simples de restringir o conteúdo de um wordpress, é exigir autenticação.

Isso pode ser visto, se incluirmos no arquivo header.php o seguinte fragmento:

<?php
if (!is_user_logged_in() ){
Header( "location:wp-admin/" );
}
?>

HOOK – Ganchos

Add_Filter

O Add_filter permite interceptar um dado, antes da sua visualização na tela.

Ele utiliza um callback, que é chamado na ocorrência do evento.

Exemplo, exibição do titulo

<?php
add_filter('the_title','view_title', 10,2);

function view_title($value, $id){
  if ($value== "NOVO") {
    $value = "NEW";
  }
  return value;
}
?>

No exemplo toda vez que um Titulo vier com nome novo, ele será substituído por NEW.

Add_action

O add_action é um evento que ocorre no momento da execução do wordpress, que é disparado durante a execução de alguma etapa de montagem da página.

Exemplo, podemos chamar a função inicializa, no momento da inicialização da página.

<?php
add_action('init','inicializa');

function inicializa(){
  echo 'Inicializou';
}

wordpress
Plugin Wordpres com AngulaJS – Parte 1

Neste artigo, irei apresentar um plugin desenvolvido com angularjs.

Apresentarei o desenvolvimento e detalhes de implementação.

A criação de um plugin é uma tarefa bem simples.

Plugin criado

Primeiro iremos criar uma pasta, e chamar do nome do nosso plugin.

Vamos chamar esse nosso exemplo de maurinsoft, conforme figura abaixo:

Pasta do projeto Maurinsoft

Agora iremos criar um arquivo maurinsoft.php, e incluir o fonte conforme referencia abaixo:

<?php
/*
Plugin Name: Maurinsoft
Plugin URL: http://maurinsoft.com.br/plugin/
Description: Plugin de Acesso a camera
Version: 1.0
Author: Marcelo Maurin Martins
Author URI: http://maurinsoft.com.br
Text Domain: maurinsoft
License: GPLv3
*/

/*Classe maurinsoft  -  Esta classe eh single instance , ou seja somente pode ser criada uma vez*/
class Maurinsoft{
	private static $instance; /*Pega a instancia da classe*/

	public static function getInstance(){
			if(self::$instance==NULL){
				self::$instance = new self(); /*caso nao exista cria uma instancia*/
			}
	}

	private function __construct(){ /*construtor da classe*/
			/** Add action do word press **/
			add_action('init',array($this,'maurinsoft_inicializa')); /* Ao inicializar */
			add_action('wp_footer',array($this,'maurinsoft_rodape')); /*informação adicional do rodape*/
			//remove_action('','');
			add_action('admin_enqueue_scrips',array($this,'add_css')); /*Registra o CSS especifico */

	}

	function add_css(){
		wp_register_style('maurinsoft',plugin_dir_url(__FILE__).'css/maurinsoft.css');
		wp_enqueue_style('maurinsoft');
	}

	function maurinsoft_aboutus(){
		echo "Maurinsoft 1.0";
	}

	function maurinsoft_rodape(){
		echo "<a href='http://maurinsoft.com.br'>maurinsoft.com.br</a> ";
	}

	function maurinsoft_inicializa(){
		if (is_user_logged_in()){
			//echo 'Logado!';
			} else {
			//echo 'Nao logado';
			}
	}

}  //Fim da classe

Maurinsoft::getInstance(); //Inicializa metodo construtor

Vamos entender este projeto:

Primeiramente, criamos uma classe Maurinsoft, onde criamos um método construtor que chama a função add_action.

O add_action é um callback, que permite vincular uma ação do wordpress a uma chamada de função.

Para quem não sabe o que é call back, recomendo ler o artigo abaixo:

http://maurinsoft.com.br/index.php/2021/02/11/callback-em-c/

O wordpress faz algumas chamadas, na primeira:

add_action('init',array($this,'maurinsoft_inicializa')); /* Ao inicializar */

Ele ao inicializar o wordpress, chama a função maurinsoft_inicializa.

Na segunda chamada:

add_action('wp_footer',array($this,'maurinsoft_rodape')); /*informação adicional do rodape*/

Ao chamar o wp_footer , ou seja o rodapé, ele chama a função maurinsoft_rodape, que inclui uma chamada ao rodapé.

E por fim,

add_action('admin_enqueue_scrips',array($this,'add_css')); /*Registra o CSS especifico */

Ao chamar os scripts ele carrega o css.

Que por sua vez tem 2 funções chamadas:

function add_css(){
		wp_register_style('maurinsoft',plugin_dir_url(__FILE__).'css/maurinsoft.css');
wp_enqueue_style('maurinsoft');
	}

A função wp_register_style, registra um arquivo css, e a wp_enqueue_style a usa.

É possível chamar diretamente através do código:

//<!-- Bootstrap -->
wp_enqueue_style('bootstrap.min','https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css');
wp_enqueue_style('bootstrap-theme.min','https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css');
wp_enqueue_script('bootstrap.min','https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js');

//<!-- AngularJS -->
wp_enqueue_script('angular.min','https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js');



//<!-- Jquery -->
//wp_enqueue_script('jquery.min.js','https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js');
wp_enqueue_script('jquery.min.js','https://code.angularjs.org/1.6.4/angular.js');


//<!-- Parte local-->
wp_enqueue_script('ctlr_test','/wp-content/plugins/comlink-application-clone-admin-page/js/ctlr_test.js');

wp_enqueue_style('style','/wp-content/plugins/comlink-application-clone-admin-page/style.css');

Por fim deixarei a lista de eventos associados ao add_action:

https://developer.wordpress.org/reference/hooks/

maurinsoft.com.br