3
\$\begingroup\$

I just started to use WordPress to start building a website, but as I need to use the get_header() function to retrieve the <head> content and I have a very large project, I wanted to put a CSS file depending on the page that is being displayed. After a few tries I came up with a solution, but I think that I can do it in a better way and I need your help to optimize it.

Here is my PHP snippet that goes into the functions.php file:

function website_files_per_page() {
    $pagelist = get_pages();
    $index = sizeof($pagelist);
    while ($index --) {
        $pagename = $pagelist[$index]->post_name;
        if (is_page($pagename)){
            $styleName = "website_".$pagename."_styles";
            $styleDir = get_theme_file_uri("/style/".$pagename.".css");
            wp_enqueue_style($styleName, $styleDir);
            break;
        }
    }
}
add_action("wp_print_styles", "website_files_per_page");
\$\endgroup\$
2
  • \$\begingroup\$ Welcome to Code Review! I notice the performance tag is used - is there a concern about execution time here being higher than desired? \$\endgroup\$ – Sᴀᴍ Onᴇᴌᴀ Oct 19 '20 at 21:31
  • \$\begingroup\$ I'd like my code to be O(1) not O(n) \$\endgroup\$ – maneroto Oct 19 '20 at 21:59
1
\$\begingroup\$

Simpler approach

I haven’t tested this but based on this SO answer using global $post and $post->page_title to set $pagename should allow you to remove the loop.

function website_files_per_page() {
    global $post;
    $pagename = $post->post_title;
    if ($pagename) {
        return; //no page name
    }
    $styleName = "website_".$pagename."_styles";
    $styleDir = get_theme_file_uri("/style/".$pagename.".css");
    wp_enqueue_style($styleName, $styleDir);
}
add_action("wp_print_styles", "website_files_per_page");

That would allow the code to run in \$O(1)\$ time instead of \$O(n)\$.

Let PHP handle the iteration

If the suggestion to use $post doesn’t work, you may be able to change the while loop to a foreach. foreach provides an easy way to iterate over arrays:

foreach ($pagelist as $post) {
    $pagename = $post->post_name;
    if (is_page($pagename)) {
        ...

With this approach there is no need to initialize and update a counter (e.g. `$index) to dereference elements in the array.

If there was a need to access the index/counter variable the second syntax can be used for that:

foreach ($pagelist as $index => $post) {
\$\endgroup\$
1
  • \$\begingroup\$ This works pretty awesome and does what I wanted, reduce the time to O(1). Thanks! \$\endgroup\$ – maneroto Jan 8 at 23:11

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.