Mika Posted November 15, 2021 Share Posted November 15, 2021 Hello, can I use the selector to extract only pages with page titles longer than 10 characters? I'm looking for a way to search directly without using the php foreach statement, as shown below. $result = $this->pages->find("template!=admin, has_parent!=2, include=all"); foreach ($result as $page) { if (strlen($page->title) > 10) { $this->table[] = $page; } } Link to comment Share on other sites More sharing options...
Robin S Posted November 16, 2021 Share Posted November 16, 2021 Welcome to the PW forums ? PW doesn't currently provide a way to find pages by the length of a field value. Although I think it would be a nice feature so I took the liberty of opening a request: https://github.com/processwire/processwire-requests/issues/424 Technically you could achieve it with a custom SQL query: $sql = 'SELECT pages.id FROM pages LEFT JOIN field_title ON field_title.pages_id = pages.id WHERE CHAR_LENGTH(field_title.data) > 10 AND pages.templates_id != 2 AND pages.parent_id != 2 AND pages.parent_id NOT IN (SELECT pages_id FROM pages_parents WHERE parents_id = 2 OR pages_id = 2)'; $ids = $database->query($sql)->fetchAll(\PDO::FETCH_COLUMN); $results = $pages->getByIDs($ids); But you might find it simpler to stick with what you're already doing. 3 Link to comment Share on other sites More sharing options...
virtualgadjo Posted November 16, 2021 Share Posted November 16, 2021 Hi, as Robin said, so far it's not a native pw selector and, being a great fan of sql queries i do like his solution ? now if you want to take advantage of what pw gives you with selectors, you can just add a numeric field to the templates you want to find name it as you want (i'll use titlelength for my example)in the field tab of the... field set it as hidden then in your ready.php file put something like this (the namespace is just here in case you don't have a ready.php file for the moment) <?php namespace ProcessWire; if(!defined("PROCESSWIRE")) die(); $pages->addHookAfter('saveReady', function($e) { $p = $e->arguments(0); if($p->template != 'template_to_play_with') return; // you could also use an array of templates to exclude and if (in_array($p->template, $your_array)) $ln = strlen($p->title); $p->set('titlelength', $ln); }); now you can filter using titlelength>10 hope it helps have a nice day 2 Link to comment Share on other sites More sharing options...
Mika Posted November 17, 2021 Author Share Posted November 17, 2021 Thank you very much. The selector is very powerful, and I will try to use the idea of adding hidden fields to the template. Link to comment Share on other sites More sharing options...
virtualgadjo Posted November 17, 2021 Share Posted November 17, 2021 hi, you'll see, it's easy to use (of course instead of $p->template !='xxx' you can use $p->parent != 2 or whatever pw page object item you want) and once you'll have played with hooks, it gives pw even more power if possible ? have a nice day Link to comment Share on other sites More sharing options...
DV-JF Posted November 17, 2021 Share Posted November 17, 2021 @Mika may I ask you, out of interest, what the specific use case is for you? Why would you want to search for a title that is at least longer than 10 characters? ? Cheers! Link to comment Share on other sites More sharing options...
Jan Romero Posted November 17, 2021 Share Posted November 17, 2021 On 11/16/2021 at 11:56 AM, Robin S said: Welcome to the PW forums ? PW doesn't currently provide a way to find pages by the length of a field value. Although I think it would be a nice feature so I took the liberty of opening a request: https://github.com/processwire/processwire-requests/issues/424 Technically you could achieve it with a custom SQL query: $sql = 'SELECT pages.id FROM pages LEFT JOIN field_title ON field_title.pages_id = pages.id WHERE CHAR_LENGTH(field_title.data) > 10 AND pages.templates_id != 2 AND pages.parent_id != 2 AND pages.parent_id NOT IN (SELECT pages_id FROM pages_parents WHERE parents_id = 2 OR pages_id = 2)'; $ids = $database->query($sql)->fetchAll(\PDO::FETCH_COLUMN); $results = $pages->getByIDs($ids); But you might find it simpler to stick with what you're already doing. Another cool way to do this would be to let ProcessWire take care of the main selector string, because you don’t really want to write page status checks and all that stuff yourself. $query = $pages->getPageFinder()->find('template!=admin, has_parent!=2, include=all', [ 'returnQuery' => true ]); $statement = $query->leftjoin('field_title on field_title.pages_id = pages.id') ->where('char_length(field_title.data) > 10') ->prepare(); $database->execute($statement); $ids = $statement->fetchAll(\PDO::FETCH_COLUMN); $results = $pages->getByIDs($ids); For this purpose you could also do the join and the condition in one call using join(). 2 Link to comment Share on other sites More sharing options...
Mika Posted November 17, 2021 Author Share Posted November 17, 2021 4 hours ago, DV-JF said: @Mika may I ask you, out of interest, what the specific use case is for you? Why would you want to search for a title that is at least longer than 10 characters? ? Cheers! I'm developing a module for SEO. This is because it is said that 50 to 60 characters is a good for the length of the page title. The 10 characters are only for my test environment.? Link to comment Share on other sites More sharing options...
virtualgadjo Posted November 17, 2021 Share Posted November 17, 2021 @Mika Hi, don't be confused by this char length thing about the page title, it actually concerns the page title tag not the title of the page the title tag is not a native pw field and and would not advise you to use the page title for both things as far as SEO is concerned, google indeed said that the first 60/65 chars are really useful (taking into account that the more a word is at the beginning the stronger it is in a title tag, you don't make a keywords list but you are not too literary either and you wouldn't like your displayed page title to look like this tag ? have a nice day Link to comment Share on other sites More sharing options...
Mika Posted November 19, 2021 Author Share Posted November 19, 2021 @virtualgadjo Thanks for the information, I decided to search the HTML tags directly and set the number of characters to a hidden field to search the pages. Good day Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now