Taxonomy-$taxonomy.php redirectioneaza spre index

Salut,

Intampin o problema, cred ca mai mult de logica / interpretare.
Am un custom post type cu alte custom taxonomii in Wordpress.

Taxonomiile sunt ierarhice si am si rewrite pentru slug. Taxonomiile au termeni de genul:

-taxonomie
  - term
    - sub-term
-festivals_categories
  - countries
    - germany
    - romania
    - etc

Am facut pagina taxonomy-$taxonomy.php.

Cand accesez slug-ul pentru taxonomie ma redirectioneaza spre index, in schimb cand accesez term si sub-term imi ofera pagina corecta, taxonomy-$taxonomy.php

function.php

function festival_location() {  
    register_taxonomy(  
        'festivals_categories',
        'festival',
        array(  
            'hierarchical' => true,  
            'label' => 'Location',
            'query_var' => true,
            'rewrite' => array(
                'slug' => 'festivals',
                'with_front' => false
            )
        )  
    );  
}  
add_action( 'init', 'festival_location');

Pagina de taxonomie nu prea are importanta pentru ca momentan este goala.
taxonomy-festivals_categories.php

festivals taxonomy(este doar text sa stiu ca sunt pe respectiva pagina)

Am citit documentatia cat si pe stackoverflow si pare OK, nu prea inteleg de ce nu imi afiseaza pagina.

LE: Am creat si taxonomy.php, am refacut permalinkurile.
Singura solutie la care ma gandesc este sa fac o pagina cu acel slug si sa fac acolo un loop pentru taxonomie si sa ramane ce am acum pentru termeni.

Stai puțin, tu accesezi arhiva taxonomiei sau a unui term?

Arhiva taxonomiei: site.com/festivals
Arhiva term: site.com/festivals/countries

Ai dezactivat toate pluginurile? Sigur ai mod_rewrite activ?

Posturile sub o anumita taxonomie se numesc arhiva? Vreau sa accesez doar acel slug(site.com/festivals) pentru a face loop in termenii taxonomiei.

Vreau sa accesez site.com/festivals, care acum ma redirectioneaza spre index.

Mai fac o data structura pentru a se inteleage mai bine.

-festivals_categories(taxonomy)
  - countries(term)
    - germany(sub-termn)
    - romania
    - etc
  - cities(term)
    -berlin(sub-term)
    -bucharest(sub-termn)

Am urmatoarele fisiere:

(taxonomy-$taxonomy-$term.php)
taxonomy-festivals_categories-countries.php

(taxonomy-$taxonomy.php)
taxonomy-festivals_categories.php

taxonomy.php

site.com/festivals ma asteptam sa imi ofere taxonomy-festivals_categories.php, in schimb ma redirectioneaza spre index.
site.com/festivals/countries/ imi acceseaza taxonomy-festivals_categories-countries.php, cum ma asteptam.
site.com/festivals/germany imi acceseaza taxonomy-festivals_taxonomy.php, ceea ce este din nou normal.

Cand accesez termenii din taxonomie afiseaza pagina corecta, deci banuiesc ca este in regula.

#WORDPRESS
		location / {
    			try_files $uri $uri/ index.php?$args;
		}

Am incercat inainte sa postez si cu toate pluginurile dezactivate.
Nu stiu cat de bine se intelege din ce explic eu aici.

Încearcă întâi să dezactivezi permalinks și să accesezi arhiva normală, e.g. site.com/?festivals_categories=countries, ca să excluzi eventualele probleme la rewrite.

Tot asa. pe site.com/?festivals_categories=countries ma duce bine, pe site.com/?festivals_categories in schimb ma duce in index.

Nu ar fi normal ca in momentul in care accesez site.com/festivals/ sa imi acceseze ce am pe taxonomy-festivals_categories.php? Ori in lipsa acelui fisier sa incarce taxonomy.php?
Adica sunt normale asteptarile mele?

Eu am un custom post type pentru evenimente. Acea taxonomie reprezinta locatiile evenimentelor(de aici countries si cities), as vrea ca in momentul in care accesez site.com/festivals/ sa incarce taxonomy-festivals_categories.php unde eu voi avea un loop cu care voi filtra posturile in functie de acele tari cat si pe baza altei taxonomii(data / an).

LE: Am incercat sa schimb numele atat la slug cat si la taxonomie, de altfel am verificat si toate taxonomiile sunt redirectionate spre index.php.
Am comentat tot ce aveam in functions.php si tot nu merge.

Daca accesez slug-ul completat la register_post_type() ma duce spre archive.php, @iamntz la asta te refereai tu cu arhiva?

register_post_type( 'festival', 

			array(

				'labels' => array(

					'name' => __( 'Festivals' ),
					'singular_name' => __( 'Festival' )

				),
				'public' => true,
				'has_archive' => true,
				'rewrite' => array( 'slug' => 'festival' ),
                'supports' => array('title', 'editor', 'thumbnail'),
			)


		);
register_taxonomy(  
        'festivals_categories', 
        'festival',       
        array(  
            'hierarchical' => true,  
            'label' => 'Location',
            'query_var' => true,
            'rewrite' => array(
                'slug' => 'festivals',
                'with_front' => true
            )
        )  
    );

Acum înțeleg ce vrei tu să faci de fapt. Nu este posibil, și are oarecum sens: tu atribui taxonomia unui post type, iar tu când vrei să afișezi toate postările, indiferent de terms, e clar că nu au treabă cu o taxonomie anume.

Ce vrei tu se poate face în felul următor:

  1. archive-festival.php în care afișezi toate postările
  2. taxonomy-festivals_categories.php în care afișezi postările sortate în funcție de un anumit term (e.g. festivals/romania)
2 Likes

Am inteles, multumesc.
M-a derutat documentatia, desi intr-adevar acum dupa ce zici si tu cand ma uit la exemple indica exact ce zici.

Anyway.
Am alta problema acum, daca ma poti indruma.

Pe scurt. Imi face redirectionare(acelasi url, site.com/festival, dar imi afiseaza index.php) in momentul in care adaug numere in value din <select> - <option>.

Cand este asa(string la value), este totul bine.


echo '<option value="australia">' . $country->name . '</option>';
var_dump: array(1) { ["festivals_categories"]=> string(9) "australia" }

In schimb cand am integer la value, cum am zis mai sus, imi incarca index.php, eu fiind pe archive-$taxonomy.php.
echo '<option value="10">' . $country->name . '</option>';

Mai sus nu am mai nimic, doar atribui unei variabile ce rezulta din get_terms() si fac un loop in ea pentru a prelua fiecare termen, mai jos am un var_dump cu $_POST si die(). Am lasat doar form, select si option, fara PHP si tot asa se manifesta.

As folosi doar slug-ul termenului, dar am nevoie sa fie interogarea mai specifica si la value vreau sa trimit doua valori, din care una trebuie sa fie obligatoriu numar.

M-am chinuit toata ziua pentru ca initial am crezut ca este de la json, eu vrand in definitiv sa adaug la value in format json.

LE: Mai pe seara probabil voi face un subiect in care sa cer sfaturi despre cum estimezi durata proiectului corect si cea mai buna metoda de a comunica clientului ca vei depasi termenul, eu duminica trebuind sa livrez proiectul :expressionless:

Eu unul nu am înțeles ce problemă ai. Poți reformula?


Dacă vrei răspunsul meu, îmi pare rău să te dezamăgesc; nu știu dacă sunt chiar cel mai în măsură să dau sfaturi în această direcție. Dar dacă vrei o discuție pe această temă, uite aici:

1 Like

Se poate ignora ce este mai sus pentru ca m-am inselat.

Am adaugat cod mai jos.
Din cate am putut sa-mi dau seama problema ar fi de la json-ul din <option> value pe care incerc sa-l trimit cu POST.

<form  method="POST" action="">

  <select name="festivals_categories">
    <option value="">All Countries</option>

    <?php
    $countries = get_terms( array(
      'taxonomy' => 'festivals_categories',
      'parent' => 8,
      'hide_empty' => true
    ) );

    foreach ($countries as $country) {
      ?>
      <option value='

      {
        "parent": <?php echo $country->parent;?>,
        "slug":"<?php echo $country->slug;?>"
      }
      '>
      <?php echo $country->name;?> 
    </option> 


    <?php
}
?>
</select>

<select name="festival_date">
  <option>All months</option>
  <?php
  $months = get_terms( array(
    'taxonomy' => 'festival_date',
    'parent' => 33,
    'hide_empty' => true
  ) );

  foreach ($months as $month) {

    ?>
    <option value='

    {
      "parent": <?php echo $month->parent;?>,
      "slug":"<?php echo $month->slug;?>"
    }

    '>
    <?php echo $month->name;?> 
  </option> 


  <?php
}
?>

</select>
<input type="submit"/>
</form>
<?php 


$list = array();
$item = array();  
foreach($_POST as $key => $value){
  
  if($value != ''){
    $json = json_decode(stripslashes($value));
    $item['taxonomy'] = htmlspecialchars($key);
    $item['field'] = $json->parent;
    $item['terms'] = $json->slug;
    $list[] = $item;
  }       
}  
$mergedArray= array_merge( $list );

$args['post_type'] = 'festival';
$args['showposts'] = -1;
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args['paged'] = $paged;  
$args['tax_query'] = $mergedArray; 

echo '<pre>';
var_dump($args);
//die();
$the_query = new WP_Query( $args );

?>

<?php echo ($the_query->found_posts > 0) ? '<h3 class="foundPosts">' . $the_query->found_posts. ' listings found</h3>' : '<h3 class="foundPosts">We found no results</h3>';?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post();

the_title(); ?> </br> <?php

endwhile; wp_reset_postdata();?>       

Eu înțeleg ce problemă ai de fapt. Ce ar trebui să se întâmple?

Treaba asta de mai jos e ciudată rău :slight_smile:

Poate că ție ți se pare inteligentă, dar peste jumătate de an o să-ți pui mâinile în cap…

<option value='

      {
        "parent": <?php echo $country->parent;?>,
        "slug":"<?php echo $country->slug;?>"
      }
      '>

Poți face următoarea chestie: value="<?php echo $country->parent . $separator . $country->slug; ?>". Când procesezi formularul, faci split la acel separator și gata, ai un array cu două elemente: primul este parent, al doilea este slug. Separatorul poate fi orice caracter non-numeric.


Dacă-mi permiți, câteva sugestii:

  1. Trimite formularul prin GET. Cel mai probabil cineva va dori să salveze un bookmark la o anumită țară.
  2. Folosește un template engine (eu am făcut un wrapper pentru Handlebars) pentru a separa html de php.
2 Likes

In momentul in care se completeaza acel formular as vrea ca interogarea care este sub el sa ofere rezultatele bazate pe ce se s-a selectat in formular. Formularul reprezinta practic optiuni din taxonomii(iar taxonomiile sunt doar nivelul 2(adica au parinte), de asta si am probleme).

De fapt problema cred este tot de logica, pentru ca am impresia ca redirectionarea spre 404.php se face pentru ca valoare din option nu este o adresa / slug valid.

Multumesc pentru sugestii.

Păi dacă tu vrei să faci redirect spre un anumit term, de ce nu faci direct asta?

<option value="<?php echo esc_url(get_term_link($month->term_id)); ?>">
  <?php echo $month->name;?>
</option>

(eventual, dacă nu vrei să ai tot URL în value, ai putea face un search&replace la domeniu)

Apoi poți face asta și cu js:

<select onchange="window.location.href = this.value">

Sau, din php:

wp_safe_redirect($_GET['select-name']);