{"id":162,"date":"2014-08-27T19:13:56","date_gmt":"2014-08-27T19:13:56","guid":{"rendered":"https:\/\/danielribes.com\/blog\/?p=162"},"modified":"2026-04-06T11:50:38","modified_gmt":"2026-04-06T11:50:38","slug":"consumiendo-servicios-soap-y-rest-en-wordpress","status":"publish","type":"post","link":"https:\/\/danielribes.com\/blog\/consumiendo-servicios-soap-y-rest-en-wordpress\/","title":{"rendered":"Consumiendo servicios SOAP y REST en WordPress"},"content":{"rendered":"<p>Recientemente he trabajado en un proyecto web en WordPress en que la web tenia que dar acceso a fuentes de informaci\u00f3n \u00abexternas\u00bb, en concreto:<\/p>\n<ul>\n<li>Acceder a consultar contenidos en otro servidor. Contenidos que se recibian a traves de un API Rest modelados en JSON.<\/li>\n<li>Registrar usuarios en un servicio de newsletter propio del cliente, usando un API SOAP<\/li>\n<\/ul>\n<p>Implementar esto con WordPress no es muy complicado porque detr\u00e1s no hay m\u00e1s que PHP, pero quiero dejar anotadas algunas cosas.<\/p>\n<p><!--more-->Para empezar el consumo de estos dos servicios lo desarrolle como plugins de WordPress, de manera que quedaban independientes de los ficheros propios del theme, esta es una practica recomendable, ya que\u00a0Wordpress no contempla el patr\u00f3n MVC, pero eso no quita que separemos las cosas de una manera razonable para facilitar mantenimiento y escabilidad y en eso los plugins son parte vital.<\/p>\n<p>Por otra parte cada uno de estos casos tenia un tratamiento diferente para WordPress, mientras que en el caso del API REST podemos usar directamente la funci\u00f3n <a href=\"http:\/\/codex.wordpress.org\/Function_Reference\/wp_remote_request\">wp_remote_request()<\/a> del API de WordPress ya que vamos a realizar una llamada GET. Para el caso de una conexi\u00f3n SOAP se implementa todo con la <em>t\u00edpica<\/em> <a href=\"http:\/\/php.net\/manual\/es\/class.soapclient.php\">SoapClient<\/a> de PHP.<\/p>\n<h2>Conectar a una API REST<\/h2>\n<p>Usando <em>wp_remote_request()<\/em> primero definimos los parametros de conexi\u00f3n. Se trata de un API REST que espera autentificar la conexi\u00f3n mediante un API KEY que nos habran asignado y (en este caso particular) una URL de referencia. Si alguno de estos parametros no es correcto no tendremos acceso.<\/p>\n<p>Esto lo hacemos asi:<\/p>\n<pre>$args_api = array('headers' =&gt; array('X-API-KEY' =&gt; $_EL_API_KEY_ASIGNADO,\r\n 'URL_BASE' =&gt; $_SERVER[\"HTTP_HOST\"]) );<\/pre>\n<p>Luego a la URL que tenemos asignada para conectarnos a la API le a\u00f1adimos los par\u00e1metros deseados\u00a0de la\u00a0conexi\u00f3n tipo\u00a0GET\u00a0que realizamos, esto es lo que hacemos aqu\u00ed, evidentemente en este caso es solo un ejemplo:<\/p>\n<pre>$url_api.='\/publicaciones_descargas\/limit\/1';<\/pre>\n<p>Con la URL de conexi\u00f3n a la API y los parametros para autentificarnos, lanzamos la conexi\u00f3n:<\/p>\n<pre>$losdatos = wp_remote_request($url_api,$args_api);<\/pre>\n<p>La funci\u00f3n <em>wp_remote_request()<\/em> nos devuelve un array con el resultado de la conexi\u00f3n, en el item <em>&#8216;body&#8217;<\/em> de ese array (en este caso) esta todo el resultado recibido desde la API. Solo nos queda tratarlo como necesitemos, en este ejemplo paso los datos recibidos en formato JSON a un array $info para su posterior uso en el WordPress:<\/p>\n<pre>$info = json_decode($losdatos['body'],true);<\/pre>\n<h2>\u00a0Conectar a una API SOAP<\/h2>\n<p>Aqu\u00ed la cosa es diferente y usamos la class <em>SoapClient.<\/em> Primero instanciamos el objeto y la conexi\u00f3n:<\/p>\n<pre>$Soap_Object = new SoapClient(\"URL DE ACCESO SOAP A LA API -aqui va el tuyo-\",\r\n array('trace' =&gt; true)\r\n );<\/pre>\n<p>Luego con el objeto creado, en este ejemplo\u00a0$Soap_Object, accedemos a las funciones propias que implemente esa API, como m\u00e9todos del objeto que hemos instanciado, por ejemplo:<\/p>\n<pre>$objResponse = $Soap_Object-&gt;existeContacto(array('email' =&gt; 'un email de ejemplo'));<\/pre>\n<p>Donde el metodo <em>existeContacto()<\/em> estar\u00e1 definido para esa API SOAP en concreto, que estemos usando. Las llamadas a los m\u00e9todos siempre (si se han hecho las cosas bien) devuelven una respuesta que podemos poner en una variable y mostrar o evaluar para saber si todo has salido ok. En este ejemplo esto ocurre en $objResponse, que luego puede, por ejemplo, usarse as\u00ed:<\/p>\n<pre>if( $objResponse-&gt;return-&gt;codigo == 4 )<\/pre>\n<p>Donde la propiedad \u00abc\u00f3digo\u00bb tambi\u00e9n es en este caso una propiedad definida por la API SOAP usada, pero que en otra sera diferente.<\/p>\n<p>Por otra parte la class SoapClient tiene otros m\u00e9todos y propiedades que nos pueden ser de ayuda en fase de desarrollo o <em>debug,<\/em> por ejemplo si una vez establecida la conexi\u00f3n ejecutamos un:<\/p>\n<pre>$objResponse = $Soap_Object-&gt;__getFunctions();\r\nprint_r($objResponse);<\/pre>\n<p>Obtendremos un array con todas los m\u00e9todos que tiene definida la API SOAP con la que estamos conectando, esto nos ayuda a ver que acciones podemos realizar. En la API SOAP del proyecto que comento, esta llamada produc\u00eda un array as\u00ed:<\/p>\n<pre>Array\r\n (\r\n [0] =&gt; borrarContactoResponse borrarContacto(borrarContacto $parameters)\r\n [1] =&gt; altaContactoResponse altaContacto(altaContacto $parameters)\r\n [2] =&gt; actualizarCorreoResponse actualizarCorreo(actualizarCorreo $parameters)\r\n [3] =&gt; existeContactoResponse existeContacto(existeContacto $parameters)\r\n [4] =&gt; borrarContactoResponse borrarContacto(borrarContacto $parameters)\r\n [5] =&gt; altaContactoResponse altaContacto(altaContacto $parameters)\r\n [6] =&gt; actualizarCorreoResponse actualizarCorreo(actualizarCorreo $parameters)\r\n [7] =&gt; existeContactoResponse existeContacto(existeContacto $parameters)\r\n )<\/pre>\n<p>Aunque esta claro que no debemos esperar a realizar esto para conocer que nos ofrece la API, ya que se supone que el cliente nos ha facilitado la documentaci\u00f3n necesaria, pero es un ejemplo de las posibilidades que nos ofrece SoapClient.<\/p>\n<h2>Nuestro amigo el Proxy<\/h2>\n<p>Todo esto funciona sin m\u00e1s problemas, pero si la web donde se realiza esta funcionando\u00a0<em>detr\u00e1s<\/em> de un proxy, las conexiones deben contemplarlo y \u00a0deben a\u00f1adir la configuraci\u00f3n de paso de tal proxy.<\/p>\n<p>En el caso de la conexi\u00f3n a la API SOAP debemos sustituir:<\/p>\n<pre>$Soap_Object = new SoapClient(\"URL DE ACCESO SOAP A LA API -aqui va el tuyo-\",\r\n array('trace' =&gt; true)\r\n );<\/pre>\n<p>Por:<\/p>\n<pre>$Soap_Object = new SoapClient(\"URL DE ACCESO SOAP A LA API -aqui va el tuyo-\",\r\n array('trace' =&gt; true, 'proxy_host' =&gt; '192.0.0.0', 'proxy_port' =&gt; '8080' )\r\n );<\/pre>\n<p>Donde 192.0.0.0 es evidentement una IP de ejemplo, en definitiva en &#8216;proxy_host&#8217; a\u00f1adimos la IP del proxy y en &#8216;proxy_port&#8217; el puerto<\/p>\n<p>Para el caso de la API REST y como la llamada es mediante <em>wp_remote_request()<\/em> bastara con tener en el wp-config.php de WordPress la configuraci\u00f3n para paso por el proxy.<\/p>\n<p>Estos solo son dos ejemplos consumiendo servicios web en un WordPress. Para ambos casos (REST y SOAP) aun hay m\u00e1s posibilidades como tambien la de ser servidor de estos servicios, pero ese ya es otro tema.<\/p>\n<p>Para tener una visi\u00f3n general de ellos, bajo PHP, recomiendo la lectura del libro <a href=\"http:\/\/shop.oreilly.com\/product\/0636920028291.do\">PHP Web Services<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Recientemente he trabajado en un proyecto web en WordPress en que la web tenia que dar acceso a fuentes de informaci\u00f3n \u00abexternas\u00bb, en concreto: Acceder a consultar contenidos en otro servidor. Contenidos que se recibian a traves de un API Rest modelados en JSON. Registrar usuarios en un servicio de newsletter propio del cliente, usando [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[115],"tags":[31,28],"class_list":["post-162","post","type-post","status-publish","format-standard","hentry","category-desarrollo","tag-api","tag-wordpress-2"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":8}},"_links":{"self":[{"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/posts\/162","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/comments?post=162"}],"version-history":[{"count":11,"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/posts\/162\/revisions"}],"predecessor-version":[{"id":262,"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/posts\/162\/revisions\/262"}],"wp:attachment":[{"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/media?parent=162"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/categories?post=162"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/tags?post=162"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}