Redirecționarea formularului către aceeași pagină

14 feb. 2013, 14:28:41
Vizualizări: 40.5K
Voturi: 2

Creez propria mea temă. În tema mea am o pagină care afișează postări personalizate folosind o interogare customizată. Am adăugat un formular în această pagină. Formularul conține 2 liste derulante care conțin valori din metadatele postării mele personalizate. Vreau ca atunci când utilizatorul selectează valori din aceste liste și face click pe submit, WordPress să afișeze din nou aceeași pagină și să adauge parametrii submitați la interogarea mea personalizată (ca un fel de filtrare a unui tabel).

Problema este că atunci când se face click pe submit, WordPress redirecționează către index.php în loc să rămână pe pagina mea.

Declarația formularului meu este:

<form action='"<?php echo get_page_link(SHIURIM_PAGE)?> "' method='get'>";

Ar trebui să pun altceva în atributul action?

Mulțumesc anticipat.

Codul complet al paginii mele:

<?php
/*
Template Name: Pagina Shiurim
*/

require 'search-form.php';
?>

<?php get_header(); 

global $THEME_PATH;
global $IMAGES_PATH;

?>

<link rel="stylesheet" type="text/css" href="<?php _e($THEME_PATH)?>/shiurim.css">

<div id="page-header-pic">
    <img src='<?php _e($IMAGES_PATH)?>/contact-header.jpg' alt="Imagine antet" title="Imagine antet pagină contact" />
</div>

<div class="page-title">
    <?php wp_title(); ?>
</div>

<div class="areaBg">
    <div class="page-content-full">
        <div class="panel">
            <div class="panel-title"></div>
            <div class="panel-content">
                <div id="pageContentId">

<?php 
    // Funcție pentru obținerea parametrilor
    function getParam($paramName, $defaultValue) {
        if ($_SERVER['REQUEST_METHOD'] === 'GET') {
            if (!empty($_GET[$paramName])) {
                return $_GET[$paramName];
            }
        }
        else {  // este un post
            if (!empty($_POST[$paramName])) {
                return $_POST[$paramName];
            }
        }
        return $defaultValue;
    }

    $pageIndex = getParam('paged', 0);
    $searchRav = getParam(SEARCH_RAV, 0);
    $searchSidra = getParam(SEARCH_SIDRA, 0);
    $searchText = getParam(SEARCH_TEXT, "");

    $searchText = trim($searchText);

    $queryArgs = array (
        'post_type' => array( POST_TYPE_SHIUR ),
        'orderby' => 'title',
        'order'    => 'ASC',
        'paged' => $pageIndex
    );

    $paginateSearchArgs = array();
    $metaQuery = array();
    if ($searchRav != 0) {
        $metaQuery[] = array(
            'key' => POST_TYPE_RAV,
            'value' => $searchRav
        );

        $paginateSearchArgs[SEARCH_RAV] = $searchRav;
    }

    if ($searchSidra != 0) {
        $metaQuery[] = array(
            'key' => POST_TYPE_SIDRA,
            'value' => $searchSidra
        );

        $paginateSearchArgs[SEARCH_SIDRA] = $searchSidra;
    }

    if (count($metaQuery) > 0) {
        $queryArgs['meta_query'] = $metaQuery;
    }

    if (! empty($searchText)) {
        $queryArgs['s'] = $searchText;

        $paginateSearchArgs[SEARCH_TEXT] = $searchText;
    }

?>

<div id="shiurimSearchPanel">
    <?php renderSearchFrom($searchRav, $searchSidra, $searchText); ?>
</div>
<div>
<?php 
    //query_posts($queryArgs);
    $shiurim_query = new WP_Query( $queryArgs );
    global $wp_query;
    // Pune obiectul interogării implicite într-o variabilă temporară
    $tmp_query = $wp_query;
    // Acum șterge-l complet
    $wp_query = null;
    // Repopulează globalul cu interogarea noastră personalizată
    $wp_query = $shiurim_query;

    $big = 999999999; // avem nevoie de un număr întreg improbabil

    echo paginate_links( array(
        'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
        'format' => '?paged=%#%',
        'current' => max( 1, get_query_var('paged') ),
        'total' => $wp_query->max_num_pages,
        'prev_text' => '&lt;&lt;',
        'next_text' => '&gt;&gt;'
    ) );
?>
</div>

<?php
    $is_first = true;
    if ( $shiurim_query->have_posts() ) : while ( $shiurim_query->have_posts() ) : $shiurim_query->the_post();

?>
            <?php if (!$is_first) { ?>
                    <div class='shiurSeperator'></div>
            <?php } ?>

            <?php
                $is_first = false;

                get_template_part( "content", "shiur-list" );
            ?> 
<?php endwhile; else: ?>
<p><?php _e('Nu s-a găsit nimic'); ?></p>

<?php 

endif;
// Restaurează obiectul interogării originale
$wp_query = $tmp_query;
// Fii amabil; resetează
wp_reset_postdata();

 ?>
                </div>
            </div>
        </div>
    </div>

    <div class="clear"></div>
</div>

<?php get_footer(); ?>

search-form.php (Îl folosesc și în index.php).

<?php

/**
 *  Panou de căutare
 */

function renderSearchFrom($searchRav = array(), $searchSidra = array(), $searchText = "") {
    $rabanimList = getPostArrayResult(POST_TYPE_RAV);
    $sdatorList = getPostArrayResult(POST_TYPE_SIDRA);  

    $html = "<div id='search-panel'>";
    $html .= "  <form action='" . get_page_link(SHIURIM_PAGE). "' method='post'>";
    $html .= "      După rav";
    $html .= "      <select name='search_rav'>";
    $html .= "          <option value='0'>Toți ravii</option>";

    foreach ($rabanimList as $rav) {
        $isSelected = ' ';
        if ($rav['id'] == $searchRav) {
            $isSelected = ' selected ';
        }

        $html .= "<option value='" . $rav['id'] . "'" . $isSelected . ">" . $rav['title'] . "</option>";

    } 

    $html .= "</select>";

    $html .= "      După sidra";
    $html .= "      <select name='search_sidra'>";
    $html .= "          <option value='0'>Toate sidrele</option>";

    foreach ($sdatorList as $sidra) {
        $isSelected = ' ';
        if ($sidra['id'] == $searchSidra) {
            $isSelected = ' selected ';
        }

        $html .= "<option value='" . $sidra['id'] . "'" . $isSelected . ">" . $sidra['title'] . "</option>";
    }

    $html .= "</select>";

    $html .= "      Text liber";
    $html .= "      <input type='text' name='search_text' class='searchFreeText' value='" . $searchText . "'/>";

    $html .= "      <input type='submit' value='Caută' />";
    $html .= "  </form>";
    $html .= "</div>";

    echo $html;
}

?>
3
Comentarii

Ce conține SHIURIM_PAGE? Ce returnează get_page_link(SHIURIM_PAGE)?

Max Yudin Max Yudin
14 feb. 2013 14:52:29

Cum este creată această pagină? arată-ne codul tău?

Bainternet Bainternet
14 feb. 2013 15:04:28

SHIURIM_PAGE este ID-ul paginii. Voi adăuga codul la întrebări.

Amos N. Amos N.
14 feb. 2013 15:18:12
Toate răspunsurile la întrebare 4
8

Dacă lăsați acțiunea goală, formularul se va trimite pe aceeași pagină.

Așadar, faceți pur și simplu asta: <form action='' method='get'>";

14 feb. 2013 14:32:36
Comentarii

Nu funcționează. Încă se redirecționează către index.php. Link-ul get_page_link(SHIURIM_PAGE) pe care l-am pus este un link direct către pagină, dar nu ajută.

Amos N. Amos N.
14 feb. 2013 14:37:33

Dacă pun method="post" funcționează, dar atunci am probleme cu parametrii de paginare.

Amos N. Amos N.
14 feb. 2013 14:38:26

Probabil folosești nume de parametri care sunt folosite și intern de WordPress. Asigură-te că le faci unice!

jberculo jberculo
14 feb. 2013 15:53:58

Parametrii mei sunt: search_rav, search_sidra și search_text. Sunt folosiți de WordPress?

Amos N. Amos N.
14 feb. 2013 16:18:10

Nu știu. Sigur nu mai sunt alții? Încearcă să verifici folosind Chrome sau firebug care sunt variabilele post...

jberculo jberculo
14 feb. 2013 18:11:24

Am găsit problema și soluția.

Amos N. Amos N.
14 feb. 2013 18:20:00

Am pus soluția și explicația la finalul întrebării mele (Stackoverflow nu m-a lăsat să răspund la propria întrebare).

Amos N. Amos N.
14 feb. 2013 18:30:48

Mulțumesc jberculo, sfatul tău m-a îndrumat spre soluție

Amos N. Amos N.
19 feb. 2013 12:10:02
Arată celelalte 3 comentarii
0

Am găsit problema și soluția.

Problema:

Folosind:

<form action="<?php echo get_page_link(66) ?>"  method="get"> 

nu funcționează corect. În HTML generat se vede:

<form action="http://mySite/?page_id=66" method="get">

Dar la trimiterea formularului, parametrul ?page_id=66 dispare. Astfel WordPress nu știe să redirecționeze cererea către șablonul paginii mele.

Soluția:

Acțiunea formularului va trimite către pagina principală și vom adăuga un câmp ascuns care va păstra page_id.

<form action="<?php echo home_url ?>"  method="get">
    <input type='hidden' name='page_id' value='66'>

Succes!

19 feb. 2013 12:08:16
0

Puteți folosi această metodă, este mai scurtă și funcționează bine:

<form action="<?php echo get_bloginfo('home').'/?page_id='.get_the_ID();  ? >" method="get" >
28 mai 2015 13:26:52
0

O altă modalitate de a trimite un formular către aceeași pagină este utilizarea variabilelor server PHP:

echo "<form name='myForm' action='http://".$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI]."' method='post'>";

Folosirea funcției the_permalink() poate de asemenea să eșueze, deoarece s-ar putea să fiți într-o buclă și the_permalink() returnează permalink-ul obiectului $post procesat în prezent de buclă în sine.

12 nov. 2015 13:10:30