Führen Sie den Shortcode zweimal auf derselben Seite aus

Ich brauche Hilfe bei einer Shortcode Frage.

Ich habe diesen Code:

add_shortcode("archive", "archive_render"); function archive_render($atts) { extract(shortcode_atts(array( "rientro" => "no", "year" => "", ), $atts)); global $wpdb; $rientro == "si" ? $rientro = "yes" : "no"; $query = "SELECT event_name FROM wp_em_events WHERE EXTRACT(YEAR FROM event_end_date) = ".$year." AND event_end_date get_col($query); function get_pasts_event( $pasts_event ){ foreach ( $pasts_event as $past_event_slug ) { $output .= "
  • $past_event_slug
  • "; } return $output; } $string = '[one_third last="'.$rientro.'" class="" id=""][accordian class="" id=""][toggle title="'.$year.'" open="no"]
      '.get_pasts_event($pasts_event).'
    [/toggle][/accordian][/one_third]'; echo do_shortcode( $string ); }

    Wenn ich es im WP-Editor doppelt oder mehrmals hinzufüge, wird nur der erste ausgeführt und die Seite funktioniert nicht mehr.

    Hat jemand eine Idee, warum meine Kurzwahl nicht mehr als einmal benutzt werden kann?

    Solutions Collecting From Web of "Führen Sie den Shortcode zweimal auf derselben Seite aus"

    Ich glaube, das wirkliche Problem, das Sie hatten, bestand darin, Ihre Daten zu wiederholen, anstatt sie zurückzugeben.

    Ein Shortcode sollte die zu zeichnende Ausgabe zurückgeben , die dann anstelle des functionscodes gezeichnet wird.

    Hier ist der Code, der die HEREDOC-Syntax für Ausgaben und die Abfrage verwendet. Ich glaube, das macht die Dinge viel lesbarer, wenn man sich daran gewöhnt hat. Siehe http://php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

    Änderungen an get_past_events:

    1. Aus der anderen function heraus verschoben (zur besseren Übersicht)
    2. Bereitstellung einer Standardeingabevariablen (zur Klarheit der Eingabeerwartungen)
    3. Überspringe die Verarbeitung, wenn keine Ereignisse empfangen wurden
    4. get_site_url() Aufruf von get_site_url() aus der Schleife herausgenommen (für alle get_site_url() gleich)
    5. Verwendete HEREDOC-Notation (für Klarheit und saubere Ausgabe)
    6. Die function wurde umbenannt, um Konflikte zu vermeiden

    Die function get_past_events:

     function do_my_get_past_events( $past_events = array() ) { $output = ''; if ( is_array($past_events) && 0 < count($past_events) ) { $site_url = get_site_url(); foreach ( $past_events as $past_event_slug ) { $output .= <<{$past_event_slug} HTML; } } return $output; } 

    Änderungen an archive_render:

    1. Ziehen Sie die Shortcode-Attribute in ein Array (Übersicht)
    2. Declare event_items (damit wir die Verarbeitung bei Bedarf überspringen können)
    3. Prepare-statement hinzugefügt (sql-Injektion verhindern) mit Ziffer
    4. Verwendete HEREDOC für Query String (Klarheit)
    5. rientro Variable (linke Deklaration – Klarheit)
    6. Geänderte string in custom_short_code (Klarheit)
    7. Gib die endgültige Ausgabe zurück (die eigentliche Korrektur)
    8. Optionaler Block hinzugefügt, falls ein Standard gewünscht wird
    9. Die function wurde umbenannt, um Konflikte mit anderen Objekten zu vermeiden

    Die function archive_render:

     add_shortcode("archive", "do_my_custom_archive_render"); function do_my_custom_archive_render($atts) { $options = shortcode_atts( array( 'year' => 0, 'rientro' => 'no' ), $atts ); $past_event_items = ''; if ( !empty( $options['year'] ) ) { global $wpdb; $query = < <prepare( $query, (int) $options['year'] ); $past_events = $wpdb->get_col($query); $past_event_items = do_my_get_past_events( $past_events ); } $rientro = ( 'si' == "{$options['rientro']}" )? 'yes' : 'no'; # If there are no event items for the year provided the user will get an empty box # If that is not what is wanted, uncomment the following 3 lines # if ( empty($past_event_items) ) { # $past_event_items = '
  • No Events Found
  • '; # } $custom_short_code = < < {$past_event_items} [/toggle] [/accordian] [/one_third] HTML; return do_shortcode( $custom_short_code ); }

    Hier ist der gleiche Code ohne HEREDOC für diejenigen, die damit nicht vertraut sind.

     function do_my_get_past_events( $past_events = array() ) { $output = ''; if ( is_array($past_events) && 0 < count($past_events) ) { $site_url = get_site_url(); foreach ( $past_events as $past_event_slug ) { $output .= '
  • ' . $past_event_slug . '' . "\r\n"; } } return $output; } add_shortcode("archive", "do_my_custom_archive_render"); function do_my_archive_render($atts) { $options = shortcode_atts( array( 'year' => 0, 'rientro' => 'no' ), $atts ); $past_event_items = ''; if ( !empty( $options['year'] ) ) { global $wpdb; $query = "SELECT event_name FROM wp_em_events WHERE EXTRACT(YEAR FROM event_end_date) = %d AND event_end_date < CURDATE()"; $query = $wpdb->prepare( $query, (int)$options['year'] ); $past_events = $wpdb->get_col($query); $past_event_items = do_my_get_past_events( $past_events ); } $rientro = ( 'si' == "{$options['rientro']}" )? 'yes' : 'no'; # Uncomment the following 3 lines if you want. # if ( empty($past_event_items) ) { # $past_event_items = '
  • No Events Found
  • '; # } $custom_short_code = '[one_third last="' . $rientro . '" class="" id=""][accordian class="" id=""][toggle title="' . $options['year'] . '" open="no"]
      ' . $past_event_items . '
    [/toggle][/accordian][/one_third]'; return do_shortcode( $custom_short_code ); }