En primer lugar, esto es muy límite dentro del alcance de WPSE, en absoluto.
Además del shortcode para activar la salida HTML inicial, esto es realmente solo AJAX.
De todos modos, dicho esto, así es como se hace:
El PHP
Suponiendo que el fragmento de PHP anterior que proporcionó es funcional, coloque lo siguiente en un archivo php para la llamada ajax:
/wp-content/themes/%your_theme%/js/ajax-load-quote.php
<?php
/* uncomment the below, if you want to use native WP functions in this file */
// require_once('../../../../wp-load.php');
$array = file( $_POST['file_path'] ); // file path in $_POST, as from the js
$r = rand( 0, count($array) - 1 );
return '<p>' . $array[$r] . '</p>';
?>
Para referencia futura y para que esta respuesta sea útil para otros: wp-load.php
tenga en cuenta que debe incluirse para hacer uso de la funcionalidad nativa de WordPress. El caso más común probablemente sea la necesidad de WP_Query
o $wpdb
.
La estructura HTML
En el contenido de una página, un widget o un archivo de plantilla:
<div id="randomquotes">
<p>I would rather have my ignorance than another man’s knowledge,
because I have so much more of it.<br />
-- Mark Twain, American author & Playwright</p>
</div>
<a id="newquote" class="button" href="#" title="Gimme a new one!">New Quote</a>
Obviamente, esto puede ajustarse a su gusto, pero por el bien de este ejemplo, esto es con lo que vamos.
Generaremos lo anterior a través de un shortcode más adelante.
El jQuery
/wp-content/themes/%your_theme%/js/ajax-load-quote.js
function ajaxQuote() {
var theQuote = jQuery.ajax({
type: 'POST',
url: ajaxParams.themeURI+'js/ajax-load-quote.php',
/* supplying the file path to the ajax loaded php as a $_POST variable */
data: { file_path: ajaxParams.filePath },
beforeSend: function() {
ajaxLoadingScreen(true,'#randomquotes');
},
success: function(data) {
jQuery('#randomquotes').find('p').remove();
jQuery('#randomquotes').prepend(data);
},
complete: function() {
ajaxLoadingScreen(false,'#randomquotes');
}
});
return theQuote;
}
/* Loading screen to be displayed during the process, optional */
function ajaxLoadingScreen(switchOn,element) {
/* show loading screen */
if (switchOn) {
jQuery(''+element).css({
'position': 'relative'
});
var appendHTML = '<div class="ajax-loading-screen appended">
<img src="'+ajaxParams.themeURI+'images/ajax-loader.gif"
alt="Loading ..." width="16" height="16" /></div>';
if( jQuery(''+element).children('.ajax-loading-screen').length === 0 ) {
jQuery(''+element).append(appendHTML);
}
jQuery(''+element).children('.ajax-loading-screen').first().css({
'display': 'block',
'visibility': 'visible',
'filter': 'alpha(opacity=100)',
'-ms-filter': '"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"',
'opacity': '1'
});
} else {
/* hide the loading screen */
jQuery(''+element).children('.ajax-loading-screen').css({
'display': '',
'visibility': '',
'filter': '',
'-ms-filter': '',
'opacity': ''
});
jQuery(''+element).css({
'position': ''
});
}
}
/* triggering the above via the click event */
jQuery('#newquotes').click( function() {
var theQuote = ajaxQuote();
return false;
});
Poniéndolo junto en functions.php
Debajo de su fragmento anterior (que encontrará incluido modificado a continuación), pegue lo siguiente:
function random_quote( $atts ) {
/* extracts the value of shortcode argument path */
extract( shortcode_atts( array(
'path' => get_template_directory_uri() . '/quotes.txt' // default, if not set
), $atts ) );
$array = file( $path );
$r = rand( 0, count($array) - 1 );
$output = '<div id="randomquotes">' .
'<p>' . $array[$r] . '</p>' .
'</div>' .
'<a id="newquote" class="button" href="#" title="Gimme a new one!">New Quote</a>';
/* enqueue the below registered script, if needed */
wp_enqueue_script( 'ajax-quote' );
/* supplying the file path to the script */
wp_localize_script(
'ajax-quote',
'ajaxParams',
array(
'filePath' => $path,
'themeURI' => get_template_directory_uri() . '/'
)
);
return $output;
}
add_shortcode( 'randomquotes', 'random_quote');
/* register the js */
function wpse72974_load_scripts() {
if ( ! is_admin() ) {
wp_register_script(
'ajax-quote',
get_template_directory_uri() . '/js/ajax-load-quote.js',
array( 'jquery' ),
'1.0',
true
);
}
}
add_action ( 'init', 'wpse72974_load_scripts' );
Opcional: el CSS para la pantalla de carga
.ajax-loading-screen {
display: none;
visibility: hidden;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 100%;
background: #ffffff; /* the background of your site or the container of the quote */
filter: alpha(opacity=0);
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
opacity: 0;
-webkit-transition: opacity .1s;
-moz-transition: opacity .1s;
-ms-transition: opacity .1s;
-o-transition: opacity .1s;
transition: opacity .1s;
z-index: 9999;
}
.ajax-loading-screen img {
position: absolute;
top: 50%;
left: 50%;
margin: -8px 0 0 -8px;
}
Recursos / Lectura
function random_quote ($path) { $ array = file ("$ path");
<br/> ...[randomquote file = "http://exampe.com/file.txt"]
<br/> Entonces, ¿funcionará? No estoy muy versado en programación.[randomquotes path="path/to/file.txt"]
, transmitida a js y desde allí al script php.Puede registrar un script en un shortcode. Se imprimirá en el pie de página, dado que el tema contiene
wp_footer()
.Cómo funciona:
add_shortcode()
.admin_url( 'admin-ajax.php' )
y obtenga nuevos datos. Inserte los datos devueltos en el elemento con el shortcode.Aquí hay un script de muestra que hace eso. Dos archivos: una clase PHP y un archivo JavaScript. Ambos deben sentarse en el mismo directorio, por ejemplo
ajax-shortcode-demo
.ajax-shortcode-demo.php
jquery-ajax-demo.js
Resultado en una publicación de blog:
fuente
define('WP_DEBUG', true);
en mi wp-config.php esta solución genera un error:Strict Standards: call_user_func_array() expects parameter 1 to be a valid callback, non-static method Ajax_Shortcode_Demo::get_instance() should not be called statically in /var/www/.../public_html/wp-includes/plugin.php on line 496
. ¿Es esto crítico? Lo cambié un poco: wordpress.stackexchange.com/q/196332/25187static
. Hice una edición en mi publicación para eso. Gracias por la noticia. Ya no escribiría el código así. :)