Ich versuche, den Eingabewert eines Shortcodes innerhalb einer Funktion zu ermitteln, die von einem Filter verwendet wird, aber es scheint keinen Erfolg zu geben. Folgendes habe ich getan:
function my_shortcode_function($atts){
$value = $atts['id'];
function filter_value(){
echo $value;
}
add_filter('posts_where','filter_value');
}
add_shortcode('my-shortcode','my_shortcode_function');
Jetzt weiß ich, dass die Verwendung von $value
in filter_value()
aufgrund variabler Bereiche nicht funktioniert, aber selbst die Verwendung von $GLOBALS['value']
funktioniert nicht.
Ich habe sogar versucht, $value = $atts['id']
innerhalb der filter_value();
zu verwenden, aber auch keinen Erfolg.
Wie kann ich meinen Shortcode wie [my-shortcode id='123']
verwenden und den 123-Wert an den Filter übergeben?
Vielen Dank.
Die Verwendung einer globalen Variablen funktioniert. Hier ist eine Demonstration:
function wpse_shortcode_function( $atts ){
// User provided values are stored in $atts.
// Default values are passed to shortcode_atts() below.
// Merged values are stored in the $a array.
$a = shortcode_atts( [
'id' => false,
], $atts );
// Set global variable $value using value of shortcode's id attribute.
$GLOBALS['value'] = $a['id'];
// Add our filter and do a query.
add_filter( 'posts_where', 'wpse_filter_value' );
$my_query = new WP_Query( [
'p' => $GLOBALS['value'],
] );
if ( $my_query->have_posts() ) {
while ( $my_query->have_posts() ) {
$my_query->the_post();
the_title( '<h1>', '</h1>');
}
wp_reset_postdata();
}
// Disable the filter.
remove_filter( 'posts_where', 'wpse_filter_value' );
}
add_shortcode( 'my-shortcode', 'wpse_shortcode_function' );
function wpse_filter_value( $where ){
// $GLOBALS['value'] is accessible here.
// exit ( print_r( $GLOBALS['value'] ) );
return $where;
}
Randnotiz, Deklarieren einer Funktion innerhalb einer anderen Funktion ist keine gute Praxis .
Hier sind einige Problemumgehungen:
Ansatz 1
Sie können die Definition des Shortcodes und den Rückruf des posts_where
-Filters in ein class einschließen, um einen bestimmten Wert zwischen den Klassenmethoden, z. als privat Variable.
Ansatz 2
Ein anderer Ansatz wäre, den Wert als Eingabe an WP_Query
innerhalb des Rückrufs Ihres Shortcodes zu übergeben:
$query = new WP_Query ( [ 'wpse_value' => 5, ... ] );
und dann können Sie in Ihrem posts_where-Filter darauf zugreifen:
add_filter( 'posts_where', function( $where, \WP_Query $query )
{
if( $value = $query->get( 'wpse_value' ) )
{
// can use $value here
}
return $where;
}, 10, 2 );
Ansatz 3
... oder Sie können auch das Beispiel von @the_dramatist anpassen, um den Rückruf anschließend zu entfernen, indem Sie die anonyme Funktion einer Variablen zuweisen:
function my_shortcode_function( $atts, $content )
{
// shortcode_atts stuff here
$value = 5; // just an example
// Add a filter's callback
add_filter( 'posts_where', $callback = function( $where ) use ( $value ) {
// $value accessible here
return $where;
} );
// WP_Query stuff here and setup $out
// Remove the filter's callback
remove_filter( 'posts_where', $callback );
return $out;
}
add_shortcode( 'my-shortcode', 'my_shortcode_function' );
Überprüfen Sie z. In den PHP Dokumenten erfahren Sie, wie Sie einer Variablen eine anonyme Funktion mit dem Schlüsselwort use zuweisen.
ps: Ich glaube, ich habe zum ersten Mal von @gmazzap von diesem Variablenzuweisungstrick erfahren, um den Rückruf eines anonymen Filters einfacher entfernen zu können.
Ich hoffe es hilft!
Sie können das Schlüsselwort use
vonPHPverwenden. Mit Hilfe dieses use
-Schlüsselworts können Sie also eine Variable in eine Funktion einfügen. Und Sie können auch anonyme Funktionen schreiben, um den Code zu reduzieren. Das Ganze wird also
/**
* How to get shorcode's input values inside a filter?
*
* @param $atts
*/
function my_shortcode_function($atts){
$value = $atts['id'];
add_filter('posts_where',function() use ( $value ){
echo $value;
});
}
add_shortcode('my-shortcode','my_shortcode_function');
Hoffentlich hilft das.
Warum nicht den Wert $ als Parameter übergeben?
function filter_value($value){
echo $value;
}