¿Qué pasa con esta statement de inclusión?

Esta función devuelve el contenido del archivo en lugar del resultado de fetch_link_settings_overide() dentro de él.

El problema no está en la función overide ya que después del error inicial comenté mi modificación solo para asegurarme de que no era algo que había hecho allí.

 function fetch_link_settings(){ include( plugins_url()."/plugin-child/plugin_overrides.php"); return fetch_link_settings_override(); } 

Agregando el contenido de la función derivada plugin-child / plugin_overrides.php ya que actualmente no estamos llegando a ningún lado.

 function fetch_link_settings_override(){ global $post; // If the destination url is set by the user, use that. Otherwise, use the permalink $destination_url = get_post_meta($post->ID, '_promo_slider_url', true); // ASAdd additional place to look in the case of the post being via the PODS advert track if( ! $destination_url ) $destination_url = get_post_meta($post->ID, 'okd_advert_link', true); if( ! $destination_url ) $destination_url = get_permalink($post->ID); // If the target attribute is set by the user, use that. Otherwise, set it to _self $target = get_post_meta($post->ID, '_promo_slider_target', true); if( ! $target ) $target = '_self'; // Setup the disable links variable $disable_links = get_post_meta($post->ID, '_promo_slider_disable_links', true); return compact('destination_url', 'target', 'disable_links'); } 

Usted escribe esto:

 include( plugins_url()."/plugin-child/plugin_overides.php"); 

¿Por qué está plugins_url() allí? La función de include se basa estrictamente en el sistema de archivos:

 The `include` statement includes and evaluates the specified file. 

Como se explica en los documentos de WordPress, plugins_url() le daría la URL web completa que es 100% diferente que el sistema de archivos en el que está instalado WordPress:

Recupera la URL absoluta del directorio de complementos (sin la barra al final) o, cuando usa el argumento $ path, a un archivo específico debajo de ese directorio.

Entonces quizás debería ser así:

 include("/plugin-child/plugin_overides.php"); 

O tal vez necesites el plugin_dir_path() ?

 include(plugin_dir_path( __FILE__ ) . "/plugin-child/plugin_overides.php"); 

Pero eso parece estar mal. ¿Dónde podría /plugin-child/plugin_overides.php ? Intenta hacer esto:

 include("/full/path/to/wordpress/and/this/plugin-child/plugin_overides.php"); 

Simplemente reemplace /full/path/to/wordpress/and/this/ con la ruta del sistema de archivos actual a /plugin-child/plugin_overides.php .

EDITAR: Dado que el póster original es persistente en el uso de plugins_url() pesar de todas las sugerencias de lo contrario, aquí está mi respuesta detallada:

… dijiste “no puedes cargar funciones crudas a través de una URL con incluir”, así que esto no es relevante porque incluso si agregué $ some_var = ‘smith’; como primer enunciado en el archivo incluido, no es visible en la función usando include.

Disculpas Funciones, clases, cadenas, constantes … Casi todo lo que quieras que sea crudo, el PHP no procesado simplemente no se pasará a través de una URL http:// o https:// porque Apache analizará las instrucciones de PHP y simplemente devolverá la salida de ese archivo y no los contenidos en bruto sin procesar del PHP en ese archivo.

Además, el póster original contiene lo siguiente:

No puede ayudarme porque lo que está diciendo no tiene sentido o no se está explicando adecuadamente. Mira estos ejemplos:

 include realpath(dirname(FILE) . "/" . "relative_path"); include("data://text/plain;base64,".base64_encode($content)); include("data://text/plain,".urlencode($content)); 

Todo tomado de la documentación oficial de PHP . Todos usan funciones que devuelven componentes que están concatenados con el rest de la url. También probé esto escribiendo el archivo de ruta explícitamente y el resultado es el mismo.

Los ejemplos citados son los siguientes:

 include realpath(dirname(FILE) . "/" . "relative_path"); 

Este es un nivel de sistema de archivos que es la forma más común en que los archivos PHP se incluyen en otros archivos.

 include("data://text/plain;base64,".base64_encode($content)); include("data://text/plain,".urlencode($content)); 

Estas son ambas URLs de data . No http o https . Así que cuando usas plugins_url() lo que plugins_url() es una URL http:// o https:// en la que Apache analiza las instrucciones de PHP y simplemente devuelve el resultado de ese archivo y no los contenidos en bruto, no procesados ​​del PHP en ese archivo. O como se explica muy claramente en la documentación de PHP a la que se está enlazando ; énfasis mío

Si “URL include wrappers” están habilitados en PHP, puede especificar el archivo que se incluirá usando una URL (a través de HTTP u otra envoltura compatible; consulte Protocolos y envolturas compatibles para obtener una lista de protocolos) en lugar de un nombre de ruta local. Si el servidor de destino interpreta el archivo de destino como código PHP, las variables pueden pasarse al archivo incluido utilizando una cadena de solicitud de URL como se usa con HTTP GET. Esto no es estrictamente lo mismo que incluir el archivo y hacer que herede el scope variable del archivo principal; el script se está ejecutando en el servidor remoto y el resultado se está incluyendo en el script local.

Volviendo a su ejemplo, usted dice que ahora el contenido de plugin_overides.php es $some_var = 'smith'; . ¿Cómo exactamente? Si es un archivo PHP como este:

 < ?php $some_var = 'smith'; ?> 

Cuando llama a ese archivo a través de una URL generada por el siguiente código:

 include(plugins_url() . "/plugin-child/plugin_overrides.php"); 

Asumiendo que su sitio web es http://some.cool.website/ , básicamente usted está haciendo una llamada como esta:

 http://some.cool.website/plugin-child/plugin_overides.php 

Por lo tanto, el resultado de plugin_overides.php sería 100% en blanco. Si desea obtener el resultado de ese archivo, puede hacer lo siguiente:

 < ?php $some_var = 'smith'; echo $some_var; ?> 

Y eso devolvería a smith . Lo que significa que la única salida absoluta que obtendrías de esa llamada es texto puro. Nada más.

Ahora veo que realmente has publicado los contenidos de plugin_overides.php . Mi explicación de ejemplo anterior todavía es apta, pero sigue siendo una pregunta básica. Esta es tu función; solo la interfaz & return por ejemplo:

 function fetch_link_settings_override(){ // Other code removed. Just a structural illustration for now. return compact('destination_url', 'target', 'disable_links'); } 

¿Realmente llama a fetch_link_settings_override() en plugin_overides.php cuando se ejecuta? Bueno, si esa función no se ejecuta, entonces hay un 100% de ninguna manera obtendrá alguna salida. Pero asumiendo la buena fe, mira tu statement de return aquí:

 return compact('destination_url', 'target', 'disable_links'); 

Si devuelve compact , entonces está devolviendo una matriz. No puede simplemente devolver una matriz vacía como una llamada a la URL como http://some.cool.website/plugin-child/plugin_overides.php . El resultado a lo sumo sería simplemente la palabra Array .

Si el objective es tomar esa matriz y hacer algo, entonces debes usar json_encode en fetch_link_settings_override y luego usar json_decode en el lado receptor de eso. Entonces la statement de return sería algo como esto:

 return json_encode(compact('destination_url', 'target', 'disable_links'));