Soporte » Guías – Resolución de problemas » como puedo hacer un require_once correctamente

  • Resuelto lucasmendez

    (@lucasmendez)


    Hola, tengo un problema que seguramente será fácil de solucionar pero por ignorancia no soy capaz de hacerlo yo solo, y tampoco he encontrado en google la respuesta que necesito.

    El problema es el siguiente:

    Quiero hacer un require_once de un archivo y no puedo hacerlo cuando salgo de la carpeta del archivo que estoy editando.

    Por ejemplo:

    Cuando hago: require_once ‘archivo-que-quiero-incluir.php’;
    todo funciona perfectamente.

    Pero cuando hago: require_once ‘../archivo-que-quiero-incluir.php’;
    aparece el error y no se ve la pagina.

    Se el motivo por el que se cae la página y da el error, el error viene porque estoy utilizando un require y esto hace que si no encuentra el archivo que se le indica pare la ejecución del programa.

    Mi problema es que no sé porque no encuentra el archivo con la ruta que le estoy indicando en el require, ya que se la estoy indicando perfectamente.

    Me he decidido ha preguntar en el foro porque puede que haya alguna peculiaridad que haya que tener en cuenta al hacer un require en wordpress que se diferencie de como se hace normalmente.

Viendo 12 respuestas - de la 1 a la 12 (de un total de 12)
  • kallookoo

    (@kallookoo)

    Hola @lucasmendez

    Simplemente tienes que usar la ruta absoluta del archivo.
    Exactamente donde tienes ese archivo? Y te comento la mejor manera.

    Iniciador del debate lucasmendez

    (@lucasmendez)

    Hola @kallookoo, gracias por contestar.

    El archivo en el que quiero hacer el require_once está aquí:
    /httpdocs/wp-content/mu-plugins/GTM.php

    Y el archivo que quiero incluir en el archivo anterior haciendo el require_once está aquí:
    /httpdocs/wp-content/plugins/woocommerce/includes/class-wc-order.php

    Yo estaba intentando hacer el require_once desde el archivo GTM.php de esta manera:
    require_once ‘../plugins/woocommerce/includes/class-wc-order.php’;

    kallookoo

    (@kallookoo)

    Hola @lucasmendez

    Veamos los mu-plugins se cargan antes que los plugins normales y por lo tanto aunque incluyas la class WP_Order tambien deberas incluir la class WC_Abstract_Order y cualquier otro archivo que esas clases necesiten.

    Podrias decirme el motivo exacto porque usas el mu-plugins?

    Iniciador del debate lucasmendez

    (@lucasmendez)

    Estoy usando el mu-plugin simplemente como un archivo de functions.php extra.
    En este caso lo estoy usando para incluir google tag manager y hacer un datalayer para recoger datos para google analytics 4.

    Todas la funcionalidades que estoy creando las añado de esta forma para que estén disponibles después de que se cargue el tema:

    add_action(‘after_setup_theme’,’añadir_gtm’);
    add_action(‘after_setup_theme’,’añadir_capa_de_datos’);

    kallookoo

    (@kallookoo)

    Hola @lucasmendez

    Viendo lo que dices te sugiero que mires la jerarquia de los ganchos, su utilidad y utilices el mas apropiado. Por ejemplo el propio WooCommerce tiene un gancho llamado woocommerce_init que se usa cuando se necesita que el WooCommerce este cargado e inicializado que se ejecuta con el gancho init del WordPress.

    https://codex.wordpress.org/Plugin_API/Action_Reference
    https://github.com/woocommerce/woocommerce/blob/trunk/includes/class-woocommerce.php#L612

    Si aun asi y volviendo a la pregunta inicial podrias usar la constante WP_PLUGIN_DIR, pero como te comente es posible que al no estar cargado x cosa de x plugin tengas problemas al no estar realmente inicializado. Ya que el gancho que usas es de los primeros y normalmente se usa el gancho init como veras en el enlace anterior.

    Iniciador del debate lucasmendez

    (@lucasmendez)

    Hola, he estado mirando la jerarquía de los ganchos, he probado con varios y sigo sin poder solucionar el error.

    Teniendo en cuenta que me has dicho que el problema está en la jerarquía, ya que estaba utilizando un gancho demasiado prematuro, y yo lo que quiero es que woocommerce este totalmente cargado para cuando haga el require, he hecho una prueba con el gancho wp_enqueue_scripts, pero sigo con el mismo problema.

    Esa parte del código se queda de esta manera:

    add_action('wp_enqueue_scripts','añadir_capa_de_datos');
    
    function añadir_capa_de_datos() {
    	//require_once '../plugins/woocommerce/includes/class-wc-order.php';
    	if (isset($_GET['key'])) {
    		add_action( 'wp_head', 'capa_de_datos_compra' );
    		function capa_de_datos_compra() { ?>
    
    <script>
    dataLayer.push({
      'event': 'purchase',
      'ecommerce': {
          'transaction_id': '<?=$_GET['key']?>',
          'affiliation': 'XXXXXX',
          'value': '59.64',
          'tax': '4.90',
          'shipping': '5.99',
          'currency': 'EUR',
          'coupon': 'SUMMER_SALE',
          'items': [{
            'item_name': 'Triblend Android T-Shirt',
            'item_id': '12345',
            'price': '15.25',
            'item_brand': 'Google',
            'item_category': 'Apparel',
            'item_variant': 'Gray',
            'quantity': 1
          }, {
            'item_name': 'Donut Friday Scented T-Shirt',
            'item_id': '67890',
            'price': '33.75',
            'item_brand': 'Google',
            'item_category': 'Apparel',
            'item_variant': 'Black',
            'quantity': 1
          }]
      }
    });
    </script>
    
    		<?php }
    	}
    }

    El problema solo lo tengo cuando hago el require, el resto es para darle un poco de contexto.

    Hola @lucasmendez

    Sin animo de ofender, etc… con mis siguientes palabras.
    Sabes programar en PHP?
    Por lo que comentas entiendo que del WordPress no o no lo suficiente.

    Te comento de nuevo visto que no entendistes lo que te comente antes.
    Los mu-plugins siempre se inician antes y cualquier gancho estara registrado en primer lugar. Esto lo comprendes?

    Luego los ganchos tienen algo llamado prioridad y sirve para modificar cuando se ejecutaran, se puede definir un action en mu-plugins con priopidad 1000 y se ejecutara cuando el WordPress detecte que esta en esa priopidad, principalmente sirve para que si fuese necesario estar seguro que cualquier otra function o method para ese gancho ya se ejecuto, etc… Esto lo comprendes?

    Te lo comento principalmente porque por lo que veo no lo tienes presente y usas cualquier gancho y tira millas.

    Otro cosa los styles y los scripts tienen sus propias funciones y subfunciones.
    wp_enqueue_script, wp_add_inline_script, etc… y es recomendable usarlas en vez de usar el wp_head o wp_print_scripts.
    Obviamente puedes usar el wp_head pero como necesites que un script este cargado tendras errores de javascript.

    Visto que insistes en hacer el require, ya te comente que uses la constante, y sus consecuencias. Aunque tambien existen otras maneras mas puras de PHP y otras de propio WordPress, pero no doy clases solo sugerencias de como hacerlo para que cualquier persona que lo lea tenga una idea de como se podria hacer y de paso aprender algo mas del WordPress.

    Ahora bien, aqui tienes como se maneja los dos puntos, y otra informacion extra; https://www.php.net/manual/es/function.include.php se aplica tambien al require y las variantes once.

    Y como te comente el WooCommerce despues de iniciarse puedes llamar directamente cualquier class suya ya que las incluye todas y por lo tanto no necesitas ningun require, include o sus variantes once y por lo tanto si usa el gancho woocommerce_init ya tendrias registrada la classes, etc… y luego dentro añades los ganchos que consideres oportunos siempre que sean anterior al init.

    Y por cierto el uso de <?= esta en deshuso y casi todos los servidores lo tienen desactivado.

    Bueno espero que no te lo tomes malamente y reescribe el codigo porque si el dataLayer.push lo haras asi cualquiera puede pasar el $_GET['key'] y liarla.

    Iniciador del debate lucasmendez

    (@lucasmendez)

    Buenas tardes @kallookoo, hace un par de meses que empecé a aprender php y aún no estoy muy familiarizado con el entorno de wordpress.

    Te agradezco mucho tu tiempo invertido y todas tus respuestas, que me han ayudado ha entender un poco mejor el desarrollo en wordpress.

    Hola @lucasmendez

    Te sugiero que mires con tranquilidad los handbooks, es un buen sitio para entender ciertas cosas y luego puedes consultar en los foros alguna cosa que no comprendas.
    Todos hemos pasado por lo mismo y siempre que yo u otro compañero pueda ayudarte no tendra problemas, pero primero acaba de aprender y o entender mas o menos bien el PHP ya que puedes tener problemas relacionados con el lenguaje que no tiene nada que ver con el WordPress.
    Como esta consulta, que preferi que entendieses como funciona el WordPress ya que aunque hicieses el require a lo bruto tendrias problemas.

    Animo y suerte!

    Iniciador del debate lucasmendez

    (@lucasmendez)

    Hola @kallookoo, ¿sabes de alguien que se dedique a dar clases particulares en este ámbito de wordpress y programación?

    kallookoo

    (@kallookoo)

    Hola @lucasmendez

    Lo he consultado con otros compañeros del foro, cuando sepa algo te lo digo yo no conozco ninguno.

    kallookoo

    (@kallookoo)

    Hola de nuevo @lucasmendez

    Me comentan que no es posible comentarte ningun curso debido a las normas de los foros ya que se considera spam.
    Tendras que hacer una busqueda por internet.
    Suerte y recuerda marcar el debate como resuelto si asi lo consideras para ayudarnos en la organizacion del foro.
    Gracias

Viendo 12 respuestas - de la 1 a la 12 (de un total de 12)
  • Debes estar registrado para responder a este debate.