Pasar variable PHP a JavaScript
¿Existe alguna posibilidad de pasar algunas variables PHP a JavaScript para poder usarlas después?
Solo en single.php
.
He oído hablar de wp_enqueue_scripts
pero con eso es necesario declarar una ruta a un archivo JS, pero no necesito uno.

Método de mejores prácticas
Echa un vistazo a wp_localize_script
, que está diseñado para hacer exactamente eso.
Pero requiere el uso previo de wp_enqueue_scripts
, por lo que necesitarás mover tu JS a un archivo separado.
Sin embargo, valdrá la pena esos pocos minutos de esfuerzo, seguro.
function wpse_96370_scripts()
{
if ( is_single() ) {
wp_register_script(
'your_script_handle',
get_template_directory_uri() . '/js/your-script.js',
array( /* dependencias */ ),
1.0,
true
);
wp_enqueue_script( 'your-script-handle' );
$script_params = array(
/* ejemplos */
'post' => 99,
'users' => array( 1, 20, 2049 )
);
wp_localize_script( 'your-script-handle', 'scriptParams', $script_params );
}
}
add_action( 'wp_enqueue_scripts', 'wpse_96370_scripts' );
En el JS podrás usar los parámetros pasados así:
var posts = scriptParams.post,
secondUser = scriptParams.users[1]; /* el índice comienza en 0 */
// iterar sobre usuarios
for ( var i = 0; i < scriptParams.users.length; i++ ) {
alert( scriptParams.users[i] );
}
[Edición] Tu situación
Según tu comentario
Creé una nueva tabla en la base de datos con algunos
response.id
de la API de Facebook. Esta es la tabla: action_id, user_id, post_id, fb_id donde fb_id es response.id de una acción de Facebook. Luego en single.php tengo un botón que al presionarlo debo eliminar la acción de Facebook con la API:FB.api('/'+fb.response, 'delete');
dondefb.response
debería serfb_id
de la tabla.
Coloca lo siguiente en la carpeta /js/
de tu tema, créala si no existe.
Llamemos al archivo fb-response.js
:
jQuery( '#button_id' ).click( function() {
FB.api( '/' + fbParams.id, 'delete' );
});
Luego registra, encola y localiza como se mostró anteriormente. Asumiendo que tienes el ID que deseas pasar en, digamos, $fb_id
:
wp_register_script(
'fb-response',
get_template_directory_uri() . '/js/fb-response.js',
array( 'jquery' ),
1.0,
true
);
wp_enqueue_script( 'fb-response' );
wp_localize_script( 'fb-response', 'fbParams', array( 'id' => $fb_id ) );
Nota: Obviamente, lo anterior asume que esto está en un tema. Si hablamos de un "plugin", modifica las ubicaciones en consecuencia.

Soy un poco principiante en esto, así que intento implementar esto en mi WordPress: http://papermashup.com/jquery-iphone-style-ajax-switch/. Como puedes ver hay un archivo js y unas pocas líneas de código js para poner en el archivo de uso. ¿O puedo poner esas pocas líneas de código en otro archivo?

¿Entonces para cualquier acción pequeña de javascript debería crear un archivo? Si estás disponible ¿puedes agregarme en skype: sebyku17?

Eso depende de lo que quieras hacer, dónde quieras hacerlo, etc. En general: No, no tienes que usar un archivo JS externo. Pero si decides hacerlo, puedes poner lo que quieras dentro de un solo archivo. No es necesario tener múltiples archivos si tienes múltiples funciones, si es eso lo que estabas preguntando. Sin embargo, ya aceptaste esta (en mi opinión bastante compleja y en tu caso un poco excesiva clase de) respuesta - sin haberla entendido completamente, según lo que veo. Sin ofender, @Johannes. ;)

Bueno, al final todo se reduce a preferencias personales, supongo. Pero una cosa es segura: cuanto más grande se vuelve tu base de código, más difícil será leerla más adelante, y más importante es mantenerla limpia. Personalmente, no me gusta tener código del lado del servidor y del cliente en el mismo archivo, con excepciones, obviamente. Un simple onclick
de una línea puede dejarse en línea, pero también renuncias al poder de wp_localize_script
.

Esta es mi página: http://funny-videoro.com/the-dark-knight-rises-trailer-oficial/, después de presionar en el reproductor e iniciar sesión, en la parte inferior del reproductor hay un botón, cuando lo presionas para apagar debería eliminar la publicación de Facebook. Intentaré crear un archivo js para todas las funciones. Espero que funcione.

No me lo tomo a mal, @tf. Hasta ahora podría ser excesivo, pero por un lado su código podría crecer y por otro, la pregunta inicial hablaba de "variables", en plural. Tu respuesta es igualmente válida, así que +1 de mi parte.

Disculpas por los malentendidos, quiero mantener el código limpio, php en archivos php y js en archivos js como dijo Johannes Pille.

Mi tema tiene 2 archivos: custom-functions.php y theme_functions.php, en custom tengo algo como:
function my_deregister_scripts() {
wp_deregister_script( 'jquery' );
wp_enqueue_script('jquery'...
wp_enqueue_script('jquery-ui'...
wp_enqueue_script('jquery-superfish' ...
wp_enqueue_script('jquery-slider'
Y en theme functions: `function mytheme_enqueue_scripts(){ wp_enqueue_script( 'jquery' );
} add_action( 'wp_enqueue_scripts', 'mytheme_enqueue_scripts');` ¿Dónde debería registrar mis variables php?

Dónde, @Sebastian, nuevamente depende de ti. La parte importante es enganchar el enqueue con la acción wp_enqueue_scripts
- he actualizado el ejemplo genérico anterior para incluir eso también.

Hice los cambios, está funcionando pero estoy seguro de que el código no está optimizado, creo que es un desastre ahí, ¿va en contra de las reglas de este sitio si le pido a alguien en privado que revise mi código? No es gran cosa y si quieres pago.

Por supuesto que puedes contratar a un profesional, pero la red stackexchange no está destinada a ser una plataforma freelance. Y si lo fuera, personalmente no tendría tiempo para trabajar con clientes de todos modos. Lo siento. También ten en cuenta que los comentarios no están destinados para discusiones extensas - esta longitud probablemente ya generó una alerta para los moderadores - me alegra haber ayudado, felicidades por haber conseguido que tu código funcione.

wp_localize_script es una función muy poco utilizada pero poderosa para pasar valores de PHP a un archivo Javascript. Es sorprendente que no mucha gente conozca realmente esta potente característica en Wordpress.

Siento lo mismo, @DigitalSea - es una de las características por las que más amo WP.

https://developer.wordpress.org/reference/functions/wp_add_inline_script/ debería ser la opción preferida hoy en día
EDIT: De la documentación anterior:
function mytheme_enqueue_typekit() {
wp_enqueue_script( 'mytheme-typekit', 'https://use.typekit.net/.js', array(), '1.0' );
wp_add_inline_script( 'mytheme-typekit', 'try{Typekit.load({ async: true });}catch(e){}' );
}
add_action( 'wp_enqueue_scripts', 'mytheme_enqueue_typekit' );
Así que primero encolas el script, y después pasas las variables
Sin embargo, este código simplemente genera lo siguiente
<script type="text/javascript" src="https://use.typekit.net/.js?ver=1.0"></script>
<script type="text/javascript"> try{Typekit.load({ async: true });}catch(e){} </script>
En mi caso, simplemente expongo los datos que necesito escribiendo directamente el código JavaScript (en la plantilla) y usando una variable global de JS con un nombre específico (no he encontrado una mejor manera) (usando Timber, PHP puro debería ser equivalente)
<script>
my_global_variable.data1 = {{ custom_timber_function()|json_encode }}
</script>
$twig->addFunction(new Timber\Twig_Function('custom_timber_function', function () {
return [
'theme' => get_stylesheet_directory_uri(),
];
}));

No, esta es la página en la que estoy trabajando: http://funny-videoro.com/the-dark-knight-rises-trailer-oficial/. Si quieres puedes iniciar sesión en el sitio web. Entonces verás un botón estilo iOS con jQuery. Cuando lo deslizo hacia "off" debo eliminar con la API de Facebook una publicación. El ID de la publicación está en la base de datos.

Bueno, eso es básicamente lo que escribí en mi respuesta. Recupera el ID de la base de datos y guárdalo en una variable. Luego imprímelo directamente en tu llamada de función JavaScript de una línea. El <input ... />
y su función era solo para propósitos de demostración. Según lo que entendí, ya está todo dicho lo que necesitas. Si no, por favor trata de explicar un poco más, pero en tu pregunta, no en comentarios.
